Wednesday, August 19, 2015

Доработка прав доступа в УТ11

Постоянно донимали пользователи со своими правами и разрешениями. В связи с этим пришлось доработать УТ11 на ускорение ввода разрешений или блокировок.

Вот и сделал себе "кайф", а пользователям радость.
Повозился пока нашел удобный вариант получения из ПВХ (Планов видов характеристик) необходимый мне объект и как итог его форму выбора
Метаданные.НайтиПоТипу(ТекущийВидДоступа.ТипЗначения.Типы()[0]).ОсновнаяФормаДляВыбора.ПолноеИмя()

И добавил следующий код

&НаКлиенте
Процедура КомандаПодбор(Команда) 
 ПараметрыФормы = Новый Структура;
 ПараметрыФормы.Вставить("РежимВыбора", Истина);
 ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Ложь);
 ПараметрыФормы.Вставить("МножественныйВыбор",Истина);
 ОткрытьФорму(ВернутьТекущуюФормуВЫбора(),ПараметрыФормы,Элементы.ЗначенияДоступа);
 //Метаданные.НайтиПоТипу(ТекущийВидДоступа.ТипЗначения.Типы()[0]).ПолноеИмя()
 //Если Метаданные.Справочники
КонецПроцедуры

Функция ВернутьТекущуюФормуВЫбора() 
 Возврат Метаданные.НайтиПоТипу(ТекущийВидДоступа.ТипЗначения.Типы()[0]).ОсновнаяФормаДляВыбора.ПолноеИмя();
КонецФункции

&НаКлиенте
Процедура ЗначениеДоступаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
 
 Если ВыбранноеЗначение = Тип("СправочникСсылка.Пользователи") ИЛИ
      ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыПользователей") Тогда
 
  СтандартнаяОбработка = Ложь;
  НачальноеЗначение = Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа;
  ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", Новый Структура("ВыборГруппПользователей, ТекущаяСтрока", Истина, НачальноеЗначение), Элемент);
 
 ИначеЕсли ВыбранноеЗначение = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ
           ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда
 
  СтандартнаяОбработка = Ложь;
  НачальноеЗначение = Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа;
  ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", Новый Структура("ВыборГруппВнешнихПользователей, ТекущаяСтрока", Истина, НачальноеЗначение), Элемент);
 КонецЕсли;
 
 тМасс = Новый Массив;
 Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") тогда
  тМасс.Добавить(ВыбранноеЗначение);
 Иначе
  тМасс = ВыбранноеЗначение;
 КонецЕсли;
 
 Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") тогда
  Для Каждого ВыбранныйЭлемент Из ВыбранноеЗначение Цикл
   Если Объект.ЗначенияДоступа.НайтиСтроки(Новый Структура("ЗначениеДоступа",ВыбранныйЭлемент)).Количество() = 0  Тогда
    НоваяСтрока = Объект.ЗначенияДоступа.Добавить();
    НоваяСтрока.ЗначениеДоступа = ВыбранныйЭлемент;
    НоваяСтрока.ВидДоступа = ТекущийВидДоступа;
   КонецЕсли;
  КонецЦикла;
 КонецЕсли;
 
КонецПроцедуры


В общем пока все работает.

Thursday, August 6, 2015

Перенос остатков на склад после включения в бухгалтерии "Ввести складской учет"

В общем тривиальная задача, есть 1С Бухгалтерия 8.2 необходимо перебросить остатки на счетах после включения "Ввести складской учет".
В нете решения не нашел, делаю свое. Форма с 3 полями "На дату", "Организация", "На склад".
Задача тривиальная, но вот заставило задумать по работе с установкой субконто и работа с партиями.


Процедура КнопкаВыполнитьНажатие(Кнопка)
   
 
 Запрос = Новый Запрос;
 Запрос.Текст = 
  "ВЫБРАТЬ
  | ХозрасчетныйОстатки.Счет,
  | ХозрасчетныйОстатки.Субконто1,
  | ХозрасчетныйОстатки.Субконто2,
  | ХозрасчетныйОстатки.Субконто3,
  | ХозрасчетныйОстатки.Организация,
  | ХозрасчетныйОстатки.Валюта,
  | ХозрасчетныйОстатки.НалоговоеНазначение,
  | ХозрасчетныйОстатки.КоличествоОстаток КАК Количество,
  | ХозрасчетныйОстатки.СуммаОстаток КАК Сумма,
  | ХозрасчетныйОстатки.ВалютнаяСуммаОстаток КАК ВалютнаяСумма,
  | ХозрасчетныйОстатки.СуммаНУОстаток КАК СуммаНУ
  |ИЗ
  | РегистрБухгалтерии.Хозрасчетный.Остатки(
  |   &НаДату,
  |   ,
  |   ,
  |   Организация = &Организация
  |    И (ТИПЗНАЧЕНИЯ(Субконто1) = ТИП(Справочник.Склады)
  |     ИЛИ ТИПЗНАЧЕНИЯ(Субконто2) = ТИП(Справочник.Склады)
  |     ИЛИ ТИПЗНАЧЕНИЯ(Субконто3) = ТИП(Справочник.Склады))) КАК ХозрасчетныйОстатки";
 
 Запрос.УстановитьПараметр("НаДату",НачалоДня(НаДату));
 Запрос.УстановитьПараметр("Организация",Организация);
 
 РезультатЗапроса = Запрос.Выполнить();
 
 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
 Операция = Документы.ОперацияБух.СоздатьДокумент();
 Операция.УстановитьНовыйНомер();
 Операция.Дата = НачалоДня(НаДату)-1;
 Операция.Организация = Организация;
 Операция.Содержание = "Корректировка остатков бух";
 Операция.Записать(); 
 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
  НоваяЗапись  = Операция.Движения.Хозрасчетный.Добавить();
  НоваяЗапись.Активность = Истина;  
  НоваяЗапись.Регистратор = Операция.Ссылка;
  НоваяЗапись.ВалютаДт = ВыборкаДетальныеЗаписи.Валюта;
  НоваяЗапись.ВалютаКт = ВыборкаДетальныеЗаписи.Валюта;
  НоваяЗапись.ВалютнаяСуммаДт = ВыборкаДетальныеЗаписи.ВалютнаяСумма;
  НоваяЗапись.ВалютнаяСуммаКт = ВыборкаДетальныеЗаписи.ВалютнаяСумма;
  НоваяЗапись.КоличествоДт =  ВыборкаДетальныеЗаписи.Количество;
  НоваяЗапись.КоличествоКт =  ВыборкаДетальныеЗаписи.Количество;
  НоваяЗапись.НалоговоеНазначениеДт = ВыборкаДетальныеЗаписи.НалоговоеНазначение;
  НоваяЗапись.НалоговоеНазначениеКт = ВыборкаДетальныеЗаписи.НалоговоеНазначение;
  НоваяЗапись.Организация = Организация;
  НоваяЗапись.Сумма = ВыборкаДетальныеЗаписи.Сумма;
  НоваяЗапись.СуммаНУДт = ВыборкаДетальныеЗаписи.СуммаНУ;
  НоваяЗапись.СуммаНУКт = ВыборкаДетальныеЗаписи.СуммаНУ;
  НоваяЗапись.СчетДт = ВыборкаДетальныеЗаписи.Счет;
  НоваяЗапись.СчетКт = ВыборкаДетальныеЗаписи.Счет;
  УстановитьСубконтоКт(НоваяЗапись,ВыборкаДетальныеЗаписи.Субконто1);
  УстановитьСубконтоКт(НоваяЗапись,ВыборкаДетальныеЗаписи.Субконто2);
  УстановитьСубконтоКт(НоваяЗапись,ВыборкаДетальныеЗаписи.Субконто3);
  Если ТипЗнч(ВыборкаДетальныеЗаписи.Субконто1) = Тип("СправочникСсылка.Склады") тогда
   УстановитьСубконтоДт(НоваяЗапись,Склад);
  Иначе
   УстановитьСубконтоДт(НоваяЗапись,ВыборкаДетальныеЗаписи.Субконто1);
  КонецЕсли;
  
  Если ТипЗнч(ВыборкаДетальныеЗаписи.Субконто2) = Тип("СправочникСсылка.Склады") тогда
   УстановитьСубконтоДт(НоваяЗапись,Склад);
  Иначе
   УстановитьСубконтоДт(НоваяЗапись,ВыборкаДетальныеЗаписи.Субконто2);
  КонецЕсли;
  
  Если ТипЗнч(ВыборкаДетальныеЗаписи.Субконто3) = Тип("СправочникСсылка.Склады") тогда
   УстановитьСубконтоДт(НоваяЗапись,Склад);
  Иначе
   УстановитьСубконтоДт(НоваяЗапись,ВыборкаДетальныеЗаписи.Субконто3);
  КонецЕсли;
  
 КонецЦикла;
 //Операция.записать(); 
 Операция.ПолучитьФорму("ФормаДокумента").Открыть();
 
 

КонецПроцедуры

Функция УстановитьСубконтоДт(Проводка,ЗначениеСубконто)
 Для Каждого ВидСубконто Из Проводка.СчетДт.ВидыСубконто Цикл
     Если ВидСубконто.ВидСубконто.ТипЗначения.СодержитТип(ТипЗнч(ЗначениеСубконто)) тогда
         Проводка.СубконтоДт[ВидСубконто.ВидСубконто.Ссылка] = ЗначениеСубконто;
     КонецЕсли;
 КонецЦикла;
КонецФУнкции

Функция УстановитьСубконтоКт(Проводка,ЗначениеСубконто)
 Для Каждого ВидСубконто Из Проводка.СчетКт.ВидыСубконто Цикл
     //Если Строка(ТипЗнч(ЗначениеСубконто)) = Строка(ВидСубконто.ВидСубконто.ТипЗначения) Тогда
  Если ВидСубконто.ВидСубконто.ТипЗначения.СодержитТип(ТипЗнч(ЗначениеСубконто)) тогда
         Проводка.СубконтоКт[ВидСубконто.ВидСубконто.Ссылка] = ЗначениеСубконто;
     КонецЕсли;
 КонецЦикла;
КонецФУнкции



Процедура ПриОткрытии()
 //НаДату = НачалоМесяца(ТекущаяДата());
 НаДату =  Дата(2015,07,01);
 Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад",Истина);
КонецПроцедуры