Как программно изменить значение субконто в бухгалтерской проводке 1С

Программист Бухгалтерский учет
← На главную

При работе с конфигурациями на базе обычных форм (например, 1С:Управление производственным предприятием или 1С:Комплексная автоматизация 1.1) часто возникает необходимость массово скорректировать аналитику в уже существующих проводках. Типичная ситуация: бухгалтеры добавили новое субконто на счет (например, «Подразделения»), и теперь нужно заполнить его в исторических данных программным способом.

В этой статье мы подробно разберем, как правильно модифицировать проводки через набор записей регистра бухгалтерии, почему прямое присвоение может не работать и как использовать универсальные механизмы для установки субконто.

Анализ проблемы: почему аналитика не сохраняется

Многие начинающие разработчики пытаются изменить субконто простым присвоением, используя точку, например: Запись.СубконтоКт.Подразделения = Значение;. Однако такой подход часто не дает результата. Рассмотрим основные причины, по которым изменения могут не записываться:

  1. Несоответствие типов: Поле субконто имеет составной тип данных, определяемый в Плане видов характеристик (ПВХ). Если передаваемое значение не соответствует типу, установленному для данного вида субконто, 1С проигнорирует запись.
  2. Индексация субконто: Обращение по индексу (например, ВидыСубконто[1]) ненадежно, так как порядок субконто на счете может измениться после обновления конфигурации или ручной правки плана счетов.
  3. Особенности набора записей: После изменения данных в цикле необходимо обязательно вызвать метод Записать() для всего набора, причем важно учитывать режим замещения записей.
  4. Измерение или субконто: В некоторых конфигурациях (например, БП 3.0) подразделение является измерением регистра, а в УПП оно может быть добавлено как субконто. Методы работы с ними принципиально различаются.

Способ 1: Использование явного обращения через План видов характеристик

Разберем самый надежный способ обращения к конкретной аналитике. Мы будем использовать ссылку на вид субконто из соответствующего ПланаВидовХарактеристик. Это гарантирует, что мы обращаемся именно к тому полю, которое нам нужно.

Проанализируем пример кода для модификации проводок по конкретному регистратору:


// Создаем набор записей регистра бухгалтерии (например, Хозрасчетный)
Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент);
Набор.Прочитать();

// Определяем нужное значение (лучше вынести поиск за пределы цикла для производительности)
НовоеПодразделение = Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000027");
ВидСубкПодразделение = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ПодразделенияОрганизаций;

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

// Записываем набор с замещением существующих записей
Набор.Записать(Истина);

В этом примере мы используем обращение Запись.СубконтоКт[...], где в квадратных скобках передается объект типа ПланВидовХарактеристикСсылка. Это наиболее «чистый» способ работы с коллекцией РегистрБухгалтерииСубконтоКоллекция.

Способ 2: Использование универсальной процедуры «УстановитьСубконто»

Если в вашей конфигурации предусмотрено много счетов с разным количеством субконто, лучше использовать универсальный метод, который проверяет наличие вида субконто на конкретном счете перед установкой значения. Рассмотрим реализацию такой процедуры, которую можно встретить в типовых решениях.

Разберем по шагам логику работы функции:


Процедура УстановитьСубконто(Счет, КоллекцияСубконто, ВидСубконто, ЗначениеСубконто) Экспорт
    // 1. Проверяем валидность счета
    Если Счет = Неопределено ИЛИ Счет.Пустая() Тогда
        Возврат;
    КонецЕсли;

    // 2. Проверяем, назначен ли данный вид субконто на этом счете
    СтрокаВидаСубконто = Счет.ВидыСубконто.Найти(ВидСубконто, "ВидСубконто");
    
    Если СтрокаВидаСубконто = Неопределено Тогда
        // Если вид субконто не найден на счете, запись невозможна
        Возврат;
    КонецЕсли;

    // 3. Проверяем соответствие типов
    Если ВидСубконто.ТипЗначения.СодержитТип(ТипЗнч(ЗначениеСубконто)) Тогда
        // Используем метод Вставить для коллекции субконто
        КоллекцияСубконто.Вставить(ВидСубконто, ЗначениеСубконто);
    Иначе
        Сообщить("Неверный тип значения для субконто " + ВидСубконто);
    КонецЕсли;
КонецПроцедуры

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


УстановитьСубконто(Запись.СчетКт, Запись.СубконтоКт, ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Подразделения, НужнаяСсылка);

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

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

1. Ручная корректировка. Если у документа-регистратора включен признак РучнаяКорректировка (свойство РучнаяКорректировка в БП 3.0 или аналогичные флаги в УПП), ваши программные изменения могут быть проигнорированы или перезаписаны при перепроведении документа пользователем. Убедитесь, что логика вашей обработки учитывает этот флаг.

2. Подписки на события. При вызове Набор.Записать() срабатывают подписки на события ПередЗаписью и ПриЗаписи регистра бухгалтерии. В УПП там часто содержатся жесткие проверки аналитики. Если ваше подразделение не заполнено в самом документе (источнике), а вы пытаетесь записать его только в проводки, типовой код может очистить субконто обратно. В таких случаях иногда требуется временно передать в ДополнительныеСвойства набора флаг отключения проверок.

3. Измерения vs Субконто. Проанализируем структуру регистра. Если в конфигураторе в регистре бухгалтерии Хозрасчетный есть измерение Подразделение, то обращаться к нему нужно напрямую: Запись.ПодразделениеКт = .... Если же подразделение добавлено только как ВидСубконто в плане счетов, работаем исключительно через коллекцию Субконто.

4. Пересчет итогов. Помните, что после массового изменения проводок напрямую через набор записей (особенно за прошлые периоды) итоги в базе могут «поехать». Рекомендуется выполнить пересчет итогов через Операции -> Управление итогами, чтобы данные в отчетах (ОСВ) соответствовали измененным проводкам.

Заключение

Программное изменение проводок — это эффективный инструмент для исправления ошибок учета. Главное правило: всегда работайте через Набор записей с отбором по регистратору и используйте ссылки из Планов видов характеристик для обращения к субконто. Это обеспечит стабильность кода даже при изменении структуры плана счетов.

← На главную