Как создать ручную операцию


Процедура КнопкаВыполнитьНажатие(Кнопка)
 // Вставить содержимое обработчика.
КонецПроцедуры

Процедура КнопкаНастройкаПериодаНажатие(Элемент)
 НП = Новый НастройкаПериода ;
 НП.ВариантНастройки=ВариантНастройкиПериода.Интервал;
 НП.ВариантНачала=ВариантГраницыИнтервала.КонкретнаяДата;
 НП.ВариантОкончания=ВариантГраницыИнтервала.КонкретнаяДата;
 
 НП.ДатаНачала=ДатаНач;
 НП.ДатаОкончания=ДатаКон;
 Если НП.Редактировать()Тогда
  ДатаНач=НП.ПолучитьДатуНачала();
  ДатаКон= НП.ПолучитьДатуОкончания();
 КонецЕсли;
 
 Если ДатаНач=Дата('00010101')  Тогда
  ДатаКон=ТекущаяДата();
 КонецЕсли;
 
КонецПроцедуры

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

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

 Для каждого СтрокаНаЧтоРаспределятьНалог Из тзНаЧтоРаспределятьНалог Цикл
  СтрокаНаЧтоРаспределятьНалог.Коэффициент = ОКР(СтрокаНаЧтоРаспределятьНалог.Количество / мОбщееКоличествоНалог,2);
 КонецЦикла;
 
 Сообщить("Суммарный коэффициент НУ:" + Строка(тзНаЧтоРаспределятьНалог.Итог("Коэффициент")));
 
 
 //Создаем источник данных для формирования ОперациБУХ по регистру Хозрасчетный
 
 тзИсточникДанныхБух = Новый ТаблицаЗначений;
 тзИсточникДанныхБух.Колонки.Добавить("СчетДт");
 тзИсточникДанныхБух.Колонки.Добавить("СубконтоДт1");
 тзИсточникДанныхБух.Колонки.Добавить("СубконтоДт2");
 
 тзИсточникДанныхБух.Колонки.Добавить("СчетКт");
 тзИсточникДанныхБух.Колонки.Добавить("СубконтоКт1");
 тзИсточникДанныхБух.Колонки.Добавить("СубконтоКт2");
 
 тзИсточникДанныхБух.Колонки.Добавить("Сумма");
 
 тзИсточникДанныхНУ = тзИсточникДанныхБух.Скопировать();
 
 Сч43Бух = ПланыСчетов.Хозрасчетный.НайтиПоКоду("43");
 Сч43Нал = ПланыСчетов.Налоговый.НайтиПоКоду("43");
 
 Для i = 1 По 2 Цикл   //1
  
  //Определяем перемменные для дальнейшего использования
  Если i = 1 тогда
   //БУ
   Счет43 = Сч43Бух;
   тзДляРаспределения     = тзЧтоРаспределять;
   тзПриемникРаспредения  = тзНаЧтоРаспределять;
   тзИсточникДанных       = тзИсточникДанныхБух;
  ИначеЕсли i =2 Тогда
   //НУ
   Счет43 = Сч43Нал;
   тзДляРаспределения    = тзЧтоРаспределятьНАЛОГ;
   тзПриемникРаспредения = тзНаЧтоРаспределятьНалог;
   тзИсточникДанных      =  тзИсточникДанныхНУ;
  КонецЕсли;
  
  
 
 Для Каждого СтрокаЧтоРаспределять Из  тзДляРаспределения Цикл
  
  мОсталосьРаспределить = СтрокаЧтоРаспределять.СуммаКРаспределению;
  
  Для Каждого СтрокаНаЧтоРаспределять Из тзПриемникРаспредения  Цикл
   НоваяСтрокаИсточника = тзИсточникДанных .Добавить();
   
   НоваяСтрокаИсточника.СчетКт = Счет43;
   НоваяСтрокаИсточника.СубконтоКт1 = СтрокаЧтоРаспределять.Номенклатура;
   НоваяСтрокаИсточника.СубконтоКт2 = Склад;
   
   НоваяСтрокаИсточника.СчетДт = Счет43;
   НоваяСтрокаИсточника.СубконтоДт1 = СтрокаНаЧтоРаспределять.Номенклатура;
   НоваяСтрокаИсточника.СубконтоДт2 = Склад;
   
   
   Если СтрокаЧтоРаспределять.СуммаКРаспределению > 1 Тогда
    НоваяСтрокаИсточника.Сумма = ОКР(СтрокаЧтоРаспределять.СуммаКРаспределению * СтрокаНаЧтоРаспределять.Коэффициент,2);
   Иначе
    //Если исходная сумма меньше единици, то не распределяем ее, а относим сразу на первую номенклатуру
    НоваяСтрокаИсточника.Сумма = СтрокаЧтоРаспределять.СуммаКРаспределению;
    Прервать;
   КонецЕсли;
   
   мОсталосьРаспределить = мОсталосьРаспределить - НоваяСтрокаИсточника.Сумма;
   
   Если мОсталосьРаспределить < 0 Тогда
    //наокругляли больше, чем надо
    НоваяСтрокаИсточника.Сумма = НоваяСтрокаИсточника.Сумма + мОсталосьРаспределить;
    Прервать;
   КонецЕсли;
   
   
  КонецЦикла;
 КонецЦикла;
 
КонецЦикла; //1


 Сообщить("Cформирован источник данных для бухгалтерской справки по регистру бухгалтерского учета :" + Строка(тзИсточникДанныхБух.Итог("Сумма")));
 Сообщить("Cформирован источник данных для бухгалтерской справки по регистру налогового учета :"     + Строка(тзИсточникДанныхНУ.Итог("Сумма")));
 
 //---------------------------------------------------------
 
 //Создаем ОперациюБух-Хозрасчетный
 
 Док = СоздатьОперациюБух_НУ_БУ(тзИсточникДанныхБух,тзИсточникДанныхНУ);
 
 Док.ПолучитьФорму().Открыть();
 
КонецПроцедуры


Функция СоздатьОперациюБух_НУ_БУ(тзИсточникДанныхБух,тзИсточникДанныхНУ)
 Док = Документы.ОперацияБух.СоздатьДокумент();
 Док.Дата = КонецДня(ДатаБухСправки);
 Док.Организация = Организация;  
 Док.Содержание = "Атоматическое распределение 43 счета";
 
 //Делаем бухгалтерские проводки
 мСумма = 0;
 Для каждого СтрокаИсточникаДанных Из тзИсточникДанныхБух Цикл
  
  НовПроводка = Док.Движения.Хозрасчетный.Добавить();
  
  НовПроводка.Период = Док.Дата;
  
  НовПроводка.СчетДт = СтрокаИсточникаДанных.СчетДт;
  
  НовПроводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] =
  СтрокаИсточникаДанных.СубконтоДт1;
  НовПроводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] =
  СтрокаИсточникаДанных.СубконтоДт2;
  
  НовПроводка.СчетКт = СтрокаИсточникаДанных.СчетКт;
  НовПроводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] =
  СтрокаИсточникаДанных.СубконтоКт1;
  НовПроводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] =
  СтрокаИсточникаДанных.СубконтоКт2;
  
  
  
  НовПроводка.Сумма = СтрокаИсточникаДанных.Сумма;
  
  мСумма = мСумма + НовПроводка.Сумма;
  
  НовПроводка.Содержание = "Распределение по 43 счету";
  
  НовПроводка.Организация = Организация;
  
 КонецЦикла;
 
 Док.СуммаОперации = мСумма;

 //---------------------------------------------
 //Делаем налоговые проводки
 
 Для каждого СтрокаИсточникаДанных Из тзИсточникДанныхНУ Цикл

  
  НовПроводка = Док.Движения.Налоговый.Добавить();
  
  НовПроводка.Период = Док.Дата;
  
  НовПроводка.СчетДт = СтрокаИсточникаДанных.СчетДт;
  
  НовПроводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] =
  СтрокаИсточникаДанных.СубконтоДт1;
  НовПроводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] =
  СтрокаИсточникаДанных.СубконтоДт2;
  
  НовПроводка.СчетКт = СтрокаИсточникаДанных.СчетКт;
  НовПроводка.СубконтоКт
[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] =
  СтрокаИсточникаДанных.СубконтоКт1;
  НовПроводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] =
  СтрокаИсточникаДанных.СубконтоКт2;
    
  НовПроводка.Сумма = СтрокаИсточникаДанных.Сумма;
  
  НовПроводка.ВидУчетаДт = Перечисления.ВидыУчетаПоПБУ18.НУ;
  НовПроводка.ВидУчетаКт = Перечисления.ВидыУчетаПоПБУ18.НУ;
  
  НовПроводка.Содержание = "Распределение по 43 счету";
  
  НовПроводка.Организация = Организация;
  
 КонецЦикла;
   
  Док.Записать(РежимЗаписиДокумента.Запись);
 
 Возврат Док;
 
КонецФункции

 

//Изменяет и перепроводит документы ТребованиеНакладная и отчет производства за смену
Процедура ИзменитьИПерепровестиДокументы()
 перем ДокОбъект;
 
 Ответ = Вопрос("Продолжить выполнение операции?", РежимДиалогаВопрос.ДаНет);
 Если Ответ = КодВозвратаДиалога.Нет Тогда
  Возврат;
 КонецЕсли;
 
 
 СоздатьОперациюБух(); 
 
КонецПроцедуры

//Пересчитывает для заданной номенклатуры количество на закладке
//РаспределениеМатериалов для ОтчетаПроизводстваЗаСмену
Процедура КоманднаяПанель1ПерепровестиДокументы(Кнопка)
 
 ИзменитьИПерепровестиДокументы();//Изменяем и перепроводим поступление
 
КонецПроцедуры

//Формирует значения по умолчанию
Процедура СформироватьЗначенияПоУмолчанию()
 
 //Свойство = ПланыВидовХарактеристик.СвойстваОбъектов.ГруппаТовара;
 //ЗначенияСвойствДляОтбора.Очистить();
 //НоваяСтрока          = ЗначенияСвойствДляОтбора.Добавить();
 //НоваяСтрока.Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоКоду("000000087");
 //НоваяСтрока          = ЗначенияСвойствДляОтбора.Добавить();
 //НоваяСтрока.Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоКоду("000000081");
 //СчетУчетаБУ          = ПланыСчетов.Хозрасчетный.НайтиПоКоду("10.01");
 
КонецПроцедуры

Процедура ПриОткрытии()
 СформироватьЗначенияПоУмолчанию();
КонецПроцедуры


Процедура ИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)
 
 ДиалогФыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
 ДиалогФыбораФайла.Фильтр = "Файл Excel(*.xls)|*.xls";
 ДиалогФыбораФайла.Заголовок = "Выбор файла загрузки свойств";
 ДиалогФыбораФайла.ПроверятьСуществованиеФайла = Истина;
 Если ДиалогФыбораФайла.Выбрать() Тогда
  Элемент.Значение = ДиалогФыбораФайла.ПолноеИмяФайла;
 КонецЕсли;
 
КонецПроцедуры