Как изменить номенклатурную группу в табличной части документов реализации в 1С:Бухгалтерия 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При ведении учета в программе 1С:Бухгалтерия предприятия 3.0 нередко возникает ситуация, когда в справочнике Номенклатура меняется привязка к номенклатурной группе, однако в ранее созданных и проведенных документах реализации остаются прежние значения. Автоматически задним числом данные в табличных частях документов не обновляются. Разберем по шагам, как выполнить массовую корректировку номенклатурных групп в документах реализации типовыми инструментами и с помощью программного кода.

Особенности структуры метаданных в 1С:Бухгалтерия 3.0

Перед тем как приступать к обработке, проанализируем структуру метаданных конфигурации, знание которой убережет от типичных ошибок:

  1. Имя документа: В дереве метаданных документ называется РеализацияТоваровУслуг (без буквы «И»). Попытка обратиться к объекту Документы.РеализацияТоваровИУслуг вызовет синтаксическую ошибку.
  2. Имя реквизита: В табличной части Товары нет поля с именем НоменклатурнаяГруппа. Аналитика счета доходов (90.01) хранится в реквизите Субконто, который имеет составной тип Характеристика.ВидыСубконтоХозрасчетные.
  3. Табличные части: В зависимости от вида операции номенклатурные позиции могут располагаться не только в табличной части Товары, но также в Услуги или АгентскиеУслуги.

Способ 1. Использование типовой функции «Изменить выделенные»

Если документов немного или их удобно отобрать в общем журнале, воспользуемся штатным механизмом группового изменения прямо из формы списка:

  1. Перейдем в раздел Продажи и откроем журнал Реализация (акты, накладные, УПД).
  2. Выделим нужные документы с помощью мыши или комбинации клавиш Ctrl + A (для выделения всех строк списка).
  3. Нажмем правой кнопкой мыши и выберем команду Изменить выделенные....
  4. В открывшемся окне перейдем на закладку табличной части Товары.
  5. Найдем строку Субконто, установим напротив нее флаг, выберем тип данных Номенклатурные группы и укажем требуемое новое значение.
  6. Если в документах присутствуют услуги, повторим аналогичное действие на закладке Услуги.
  7. Нажмем кнопку Изменить реквизиты и дождемся завершения операции.

Способ 2. Типовая обработка «Групповое изменение реквизитов»

Для более гибкой выборки большого массива документов за произвольный период воспользуемся встроенной сервисной обработкой:

  1. Откроем раздел Администрирование → Обслуживание → Корректировка данных → Групповое изменение реквизитов.
  2. В поле Изменять выберем объект Реализация (акты, накладные, УПД).
  3. По гиперссылке Все элементы настроим отбор (например, по периоду, организации или текущему значению реквизита Товары.Субконто).
  4. В таблице реквизитов перейдем на закладку Товары, отметим реквизит Субконто и установим необходимое значение номенклатурной группы.
  5. Внизу формы нажмем кнопку Изменить реквизиты.

Способ 3. Программная обработка данных на управляемых формах

Выясним причину ошибок, которые часто возникают у начинающих разработчиков при написании внешних обработок на управляемых формах:

  1. Ошибка «Переменная не определена (Документы)»: Менеджеры объектов метаданных (Документы, Справочники и др.) недоступны в контексте клиента. Любая работа с базой данных должна выполняться в процедурах с директивой &НаСервере или &НаСервереБезКонтекста.
  2. Актуализация проводок: Простого вызова Записать(РежимЗаписиДокумента.Запись) недостаточно для проведенного документа — движения по регистру бухгалтерии останутся со старой номенклатурной группой. Документ необходимо перепроводить.

Посмотрим на пример правильной серверной процедуры для внешней обработки:


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

Важные рекомендации при массовой обработке

  1. Дата запрета изменения данных: Если документы входят в закрытый период, программа заблокирует запись. Перед выполнением обработки необходимо временно сдвинуть дату запрета в разделе Администрирование → Настройки пользователей и прав → Даты запрета изменения.
  2. Резервная копия: Перед запуском любых групповых обработок обязательно создавайте резервную копию информационной базы (выгрузка .dt или копия файла 1Cv8.1CD).
  3. Групповое перепроведение: Если запись производилась без проведения, после завершения обработки необходимо запустить операцию Групповое перепроведение документов в разделе Операции → Сервис.
← На главную