При ведении учета в программе 1С:Бухгалтерия предприятия 3.0 нередко возникает ситуация, когда в справочнике Номенклатура меняется привязка к номенклатурной группе, однако в ранее созданных и проведенных документах реализации остаются прежние значения. Автоматически задним числом данные в табличных частях документов не обновляются. Разберем по шагам, как выполнить массовую корректировку номенклатурных групп в документах реализации типовыми инструментами и с помощью программного кода.
Перед тем как приступать к обработке, проанализируем структуру метаданных конфигурации, знание которой убережет от типичных ошибок:
РеализацияТоваровУслуг (без буквы «И»). Попытка обратиться к объекту Документы.РеализацияТоваровИУслуг вызовет синтаксическую ошибку.Товары нет поля с именем НоменклатурнаяГруппа. Аналитика счета доходов (90.01) хранится в реквизите Субконто, который имеет составной тип Характеристика.ВидыСубконтоХозрасчетные.Товары, но также в Услуги или АгентскиеУслуги.Если документов немного или их удобно отобрать в общем журнале, воспользуемся штатным механизмом группового изменения прямо из формы списка:
Ctrl + A (для выделения всех строк списка).Для более гибкой выборки большого массива документов за произвольный период воспользуемся встроенной сервисной обработкой:
Реализация (акты, накладные, УПД).Товары.Субконто).Выясним причину ошибок, которые часто возникают у начинающих разработчиков при написании внешних обработок на управляемых формах:
Документы, Справочники и др.) недоступны в контексте клиента. Любая работа с базой данных должна выполняться в процедурах с директивой &НаСервере или &НаСервереБезКонтекста.Записать(РежимЗаписиДокумента.Запись) недостаточно для проведенного документа — движения по регистру бухгалтерии останутся со старой номенклатурной группой. Документ необходимо перепроводить.Посмотрим на пример правильной серверной процедуры для внешней обработки:
&НаСервере
Процедура ЗаменитьНоменклатурнуюГруппуНаСервере(ДатаНачала, ДатаОкончания, НоваяГруппа)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг
|ГДЕ
| Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
| И Проведен = ИСТИНА";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
БылИзменен = Ложь;
// Обработка табличной части "Товары"
Для Каждого Стр Из ДокументОбъект.Товары Цикл
Если Стр.Субконто <> НоваяГруппа Тогда
Стр.Субконто = НоваяГруппа;
БылИзменен = Истина;
КонецЕсли;
КонецЦикла;
// Обработка табличной части "Услуги"
Для Каждого Стр Из ДокументОбъект.Услуги Цикл
Если Стр.Субконто <> НоваяГруппа Тогда
Стр.Субконто = НоваяГруппа;
БылИзменен = Истина;
КонецЕсли;
КонецЦикла;
Если БылИзменен Тогда
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ЗаписьЖурналаРегистрации("ПакетнаяОбработка", УровеньЖурналаРегистрации.Ошибка,,,
"Ошибка проведения документа " + Строка(ДокументОбъект.Ссылка) + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
.dt или копия файла 1Cv8.1CD).