Как программно изменить проводки в операциях при изменении плана счетов

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

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

Почему нельзя просто использовать запрос для изменения проводок

Начинающие разработчики часто пытаются подойти к задаче через выборку данных запросом. Однако важно помнить: проводки в 1С хранятся в регистрах бухгалтерии, и их нельзя изменить напрямую через результат запроса. Запрос предназначен только для чтения. Для модификации данных необходимо использовать специальные объекты платформы — РегистрБухгалтерииМенеджер и РегистрБухгалтерииНаборЗаписей. Мы должны считать записи регистра по конкретному регистратору (документу), внести изменения в памяти и записать их обратно в базу данных.

Алгоритм решения задачи через Набор Записей

Рассмотрим общий план действий, который мы будем реализовывать:

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

Реализация кода для изменения счета

Проанализируем пример кода, который позволяет выполнить замену счета. Предположим, нам нужно заменить старый счет на новый в регистре «Хозрасчетный» (или «Типовой» для Казахстана).


// 1. Сначала выбираем документы-регистраторы запросом
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |   Хозрасчетный.Регистратор КАК Регистратор
    |ИЗ
    |   РегистрБухгалтерии.Типовой КАК Хозрасчетный
    |ГДЕ
    |   (Хозрасчетный.СчетДт = &СтарыйСчет ИЛИ Хозрасчетный.СчетКт = &СтарыйСчет)";

Запрос.УстановитьПараметр("СтарыйСчет", ПланыСчетов.Типовой.НайтиПоКоду("1110")); // Пример старого кода
Выборка = Запрос.Выполнить().Выбрать();

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

Работа с субконто при замене счета

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

Важный момент: если вы просто меняете счет в записи, 1С не очищает субконто автоматически. Если на новом счете меньше аналитик, лишние данные могут привести к ошибкам или некорректным отчетам. Проанализируем, как правильно обращаться к субконто:


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

Оптимизация производительности при массовой обработке

Если количество документов исчисляется тысячами, обычный перебор может затянуться на часы. Выясним причины замедления и способы ускорения:

Особенности для учета в Казахстане

В конфигурациях для РК (Бухгалтерия для Казахстана) учет часто дублируется. Изменение только в регистре «Типовой» (бухгалтерский учет) приведет к разрыву с налоговым учетом. Проанализируем дополнительные шаги:

  1. Налоговый учет: Обязательно проверяйте наличие аналогичных проводок в регистре накопления или регистре бухгалтерии «Налоговый». Счет в налоговом учете также может требовать замены.
  2. Валютный учет: Если новый счет является валютным, убедитесь, что в записи заполнены ресурсы ВалютнаяСумма и измерение Валюта. Если старый счет был валютным, а новый — нет, эти данные следует очистить.
  3. Активность записи: При программном изменении проверяйте свойство Запись.Активность. Обычно следует изменять только активные записи, чтобы не затронуть сторнированные или помеченные на удаление операции без необходимости.

Безопасность и проверка результатов

Перед запуском любой обработки, изменяющей движения документов, обязательно сделайте резервную копию базы данных. Рассмотрим также метод «холостого хода»: сначала запустите код, который просто выводит в консоль количество найденных записей и документов, которые будут изменены, без вызова метода Набор.Записать(). Это позволит убедиться, что условия поиска (фильтры) настроены верно и вы не измените лишние данные.

После завершения работы обработки обязательно сформируйте отчет «Оборотно-сальдовая ведомость» по старому и новому счетам, чтобы убедиться, что сальдо и обороты перешли корректно и на старом счете не осталось «хвостов» из-за ошибок в коде.

← На главную