В конфигурации ПУБ 1Cv7.7 возникла следующая задача. Ежедневно выписываются "автоматом" по полученным заявкам от покупателей порядка 200 накладных реализации и к ним столько же счетов фактур. После доставки продукции покупателям оператор ручками корректирует некоторые накладные в базе.
Поставили задачу: при изменении документов реализации надо автоматом менять и подчиненный счет-фактуру. Сравнительно простое решение без ВК заключается в небольшой модификации модуля формы Счета-фактуры:
//********************************************
// Предопределенная процедура Счета-фактуры
Процедура ПриОткрытии()
Парам = Форма.Параметр;
...
//2012
Если Парам = "Переоформить" Тогда
ЗаполнитьШапку();
ЗаполнитьТабЧасть();
Записать();
СтатусВозврата(0);
КонецЕсли;
//2012
...
КонецПроцедуры // ПриОткрытии
Допишем в модуль формы документа Реализации новую процедуру:
//2012
//********************************************
// Предопределенная процедура Реализации
Процедура ПриЗакрытии()
Если ДатаДок<=Константа.ДатаЗапретаРедактирования Тогда
Возврат;
КонецЕсли;
ПриЗаписи();
Если СтатусВозврата()=0 Тогда
Возврат;
КонецЕсли;
//изменить Счет-Фактуру
докСФ = СоздатьОбъект("Документ.СчетФактура");
докСФ.ВыбратьДокументы(ДатаДок,ДатаДок);
Пока докСФ.ПолучитьДокумент()=1 Цикл
Если докСФ.ДокументОснование=ТекущийДокумент() Тогда
СФ=докСФ.ТекущийДокумент();
ДокСФ.СделатьНепроведенным();
ДокСФ.УдалитьСтроки();
Параметр = "Переоформить";
ОткрытьФорму(докСФ.ТекущийДокумент(), Параметр);
Прервать;
КонецЕсли;
КонецЦикла;
докСФ = СоздатьОбъект("Документ.СчетФактура");
докСФ.НайтиДокумент(СФ);
Если докСФ.Выбран()=1 Тогда
докСФ.Комментарий = "Изменен: " + Пользователь;
докСФ.Записать();
Если Проведен()=1 Тогда
докСФ.Провести();
КонецЕсли;
КонецЕсли;
КонецПроцедуры //ПриЗакрытии
//2012
Теперь при изменении и закрытии документа Реализация автоматом корректируется и счет фактура. Если реализация проведена, проводится и счет-фактура. Использованные комментарии вида //2012 в начале и конце добавленных строк позволяют удобно отследить внесенные изменения при обновлении конфигурации. Представляется, что решение можно использовать и в Бухгалтерии, изменив строки заполнения шапки и табл.части в счете-фактуре.
И напоследок, модуль обработки группового исправления и проведения счетов-фактур
//*******************************************
Функция ПроверкаПериода()
Если ПустоеЗначение(Дата1) = 1 Тогда
Предупреждение("Не указана дата начала периода отчета!");
Возврат 0;
КонецЕсли;
Если Дата1 > Дата2 Тогда Предупреждение("Неправильно задан период отчета!"+РазделительСтрок+ "Дата начала больше даты окончания периода.");
Возврат 0;
КонецЕсли;
Возврат 1;
КонецФункции //ПроверкаПериода
//*******************************************
// Сформировать()
Процедура Сформировать()
Если ПроверкаПериода()=0 Тогда
Возврат;
ИначеЕсли Дата1<Константа.ДатаЗапретаРедактирования Тогда
Предупреждение("Нельзя проводить документы ранее даты запрета редактирования!");
Возврат;
КонецЕсли;
ВремяНачала = _GetPerformanceCounter();
докСФ = СоздатьОбъект("Документ.СчетФактура");
докСФ.ВыбратьДокументы(Дата1,Дата2);
Пока докСФ.ПолучитьДокумент()=1 Цикл
Если докСФ.ДокументОснование.Вид()="РеализацияПродукции" Тогда
Если (докСФ.Проведен()=1) и (ПроводитьТолькоНепроведенные=1) Тогда
Продолжить;
КонецЕсли;
ДокСФ.СделатьНепроведенным();
ДокСФ.УдалитьСтроки();
Параметр = "Переоформить";
ОткрытьФорму(докСФ.ТекущийДокумент(), Параметр);
Если докСФ.ДокументОснование.Проведен()=1 Тогда
ДокСФ.Провести();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Сообщить("Документы проведены. Время: " + Сокрл(Формат((_GetPerformanceCounter() - ВремяНачала)/1000, "Ч12.1")) + " сек."); КонецПроцедуры //Сформировать
//*******************************************
Дата1 = ТекущаяДата()-1;
Дата2 = ТекущаяДата()-1;