Как автоматически заполнить субконто Склады на 94 счете в документе Отражение недостачи без перепроведения

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

В процессе работы с конфигурацией 1С:Бухгалтерия для Беларуси (редакция 2.1), которая по своей архитектуре схожа с 1С:Бухгалтерия предприятия 3.0, программисты и бухгалтеры часто сталкиваются с необходимостью детализации аналитики. Одной из таких задач является добавление субконто Склады на счет 94 «Недостачи и потери от порчи ценностей».

Сложность ситуации заключается в том, что стандартный документ ОтражениеНедостачи при проведении может не заполнять это субконто, если оно было добавлено пользователем самостоятельно в план счетов. Кроме того, часто требуется обновить данные в уже существующих (проведенных) документах, не меняя дату их проведения и не открывая период для редактирования. В этой статье мы подробно разберем, как решить эту задачу с помощью внешней обработки.

Анализируем причину проблемы

Для начала проанализируем, почему субконто не заполняется автоматически. В типовом плане счетов счет 94 обычно имеет аналитику по Номенклатуре и Партиям. Если вы добавили третье субконто Склады, программный модуль документа ОтражениеНедостачи просто «не видит» этого изменения. В коде формирования проводок жестко прописано заполнение только стандартных измерений.

Существует два пути решения:

  1. Для будущих документов: Создание расширения с подпиской на событие ОбработкаПроведения или ПередЗаписью регистра бухгалтерии.
  2. Для уже существующих документов: Использование внешней обработки, которая точечно изменит записи в регистре бухгалтерии без вызова штатных процедур проведения.

Рассмотрим подробнее второй вариант, так как он позволяет исправить исторические данные без риска «развалить» последовательность документов.

Алгоритм работы внешней обработки

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

  1. Получить список (массив) ссылок на документы ОтражениеНедостачи, которые требуют корректировки.
  2. С помощью запроса извлечь информацию о складе из каждого документа.
  3. Для каждого документа создать объект РегистрБухгалтерииНаборЗаписей.Хозрасчетный.
  4. Установить фильтр по регистратору.
  5. Прочитать текущие проводки.
  6. Найти строки, где задействован счет 94, и установить значение субконто Склады.
  7. Записать набор в специальном режиме, игнорирующем проверки.

Шаг 1: Получение данных через запрос

Проанализируем ситуацию: склад в документе может находиться как в шапке (реквизит Склад), так и в табличной части. В документе ОтражениеНедостачи склад обычно указывается в шапке. Напишем простой запрос для получения этих данных:


ВЫБРАТЬ
    ОтражениеНедостачи.Ссылка КАК Ссылка,
    ОтражениеНедостачи.Склад КАК Склад
ИЗ
    Документ.ОтражениеНедостачи КАК ОтражениеНедостачи
ГДЕ
    ОтражениеНедостачи.Ссылка В (&МассивСсылок)
    И ОтражениеНедостачи.Проведен = ИСТИНА

Этот запрос позволяет нам получить таблицу соответствия: какой склад должен быть подставлен для конкретного документа-регистратора.

Шаг 2: Программное изменение проводок

Разберем самый важный этап — работу с регистром бухгалтерии. Чтобы изменить данные без перепроведения, мы будем использовать свойство ОбменДанными.Загрузка = Истина. Это критически важный момент: данный флаг отключает выполнение прикладных проверок и позволяет записывать данные «как есть».

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


Для Каждого СтрокаДанных Из РезультатЗапроса Цикл
    
    // Создаем набор записей регистра
    НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(СтрокаДанных.Ссылка);
    
    // Читаем существующие проводки документа из базы
    НаборЗаписей.Прочитать();
    
    Изменено = Ложь;
    
    Для Каждого Проводка Из НаборЗаписей Цикл
        
        // Нам нужно заполнить субконто на 94 счете. 
        // Проверяем счет по дебету и по кредиту
        Если Проводка.СчетДт = ПланыСчетов.Хозрасчетный.НедостачиИПотериОтПорчиЦенностей Тогда
            
            // Обращаемся к коллекции субконто по типу
            ВидСубконтоСклады = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады;
            Проводка.СубконтоДт[ВидСубконтоСклады] = СтрокаДанных.Склад;
            Изменено = Истина;
            
        КонецЕсли;

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

Важные нюансы работы с Субконто

Выясним причину, почему нельзя просто написать Проводка.Субконто1 = Склад. В системе 1С субконто в регистре бухгалтерии реализованы не как обычные реквизиты, а как Карта (Map) или Соответствие. Ключом в этом соответствии является объект из плана видов характеристик ВидыСубконтоХозрасчетные, а значением — конкретный элемент справочника (в нашем случае — Склады).

Использование конструкции Проводка.СубконтоДт[ВидСубконтоСклады] гарантирует, что значение попадет именно в тот «слот» аналитики, который отведен под склады на данном счете, независимо от того, является он первым, вторым или третьим в списке.

Особенности использования режима ОбменДанными.Загрузка

Рассмотрим подробнее, что происходит при установке ОбменДанными.Загрузка = Истина:

Внимание! При использовании этого метода данные в проводках изменятся, но в самом документе (в его экранной форме) значения могут остаться старыми, если там не предусмотрены соответствующие поля. Поэтому всегда следите за тем, чтобы данные в документе и в регистре были синхронизированы.

Как автоматизировать заполнение в будущем

Чтобы не запускать обработку каждый раз, проанализируем возможность использования Подписки на событие. Мы можем создать расширение конфигурации и добавить подписку на событие ОбработкаПроведения документа ОтражениеНедостачи. В процедуре-обработчике подписки мы сможем дописать логику заполнения субконто 94 счета сразу в момент создания проводок системой.

Пример логики для подписки (в модуле расширения):


Процедура Расш1_ЗаполнитьСкладПередЗаписьюРегистра(Источник, Отказ, Замещение)
    // Источник — это НаборЗаписей регистра бухгалтерии
    // Находим склад через Регистратор
    Если ТипЗнч(Источник.Отбор.Регистратор.Значение) = Тип("ДокументСсылка.ОтражениеНедостачи") Тогда
        СкладДокумента = Источник.Отбор.Регистратор.Значение.Склад;
        Для Каждого Запись Из Источник Цикл
            Если Запись.СчетДт.Код = "94" Тогда
                Запись.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] = СкладДокумента;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Этот подход позволит системе «автомагически» заполнять аналитику при каждом проведении документа пользователем, избавляя вас от ручного труда и необходимости использования внешних обработок в будущем.

← На главную