Как устранить ошибку дублирования записей в регистре Расчет списания косвенных расходов при объединении статей затрат?

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

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

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

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

Анализ влияния регистра на учет и отчетность

Прежде чем приступать к программным действиям, проанализируем, за что отвечает регистр Расчет списания косвенных расходов. Этот регистр является вспомогательным (расчетным). Его основное предназначение — хранение промежуточных и итоговых данных для формирования печатных форм «Справка-расчет», которые бухгалтер открывает по гиперссылке из помощника закрытия месяца.

Важные выводы:

  1. Проводки и баланс: Данные в этом регистре напрямую не формируют проводки по счетам бухгалтерского и налогового учета. Проводки генерируются документом «Регламентная операция» отдельно в регистр бухгалтерии Хозрасчетный.
  2. Налоговая декларация: Декларация по налогу на прибыль собирает данные из регистра бухгалтерии (проводки по НУ), а не из этого регистра сведений. Следовательно, корректировка или даже удаление записей в Расчет списания косвенных расходов не приведет к искажению налоговой отчетности.
  3. Справки-расчеты: Это единственное место, где изменения будут заметны. Если просто удалить «лишнюю» запись, сумма в справке-расчете по конкретной статье уменьшится. Если схлопнуть записи (суммировать) — итоговая сумма в справке останется верной, но аналитика по статьям изменится в соответствии с нашими правками.

Способ 1. Программное «схлопывание» записей через Таблицу Значений

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

Суть метода заключается в том, чтобы выбрать все записи регистра по конкретному документу-регистратору, заменить в них «старую» статью на «новую», а затем свернуть таблицу по ключевым полям, просуммировав числовые ресурсы.

Пример кода для реализации такой обработки:


// Определяем параметры: Регистратор и Статьи
СтараяСтатья = Справочники.СтатьиЗатрат.НайтиПоНаименованию("Дубль");
НоваяСтатья  = Справочники.СтатьиЗатрат.НайтиПоНаименованию("Оригинал");

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

// Выгружаем в ТЗ для удобства манипуляций
ТЗ_Движений = НаборЗаписей.Выгрузить();

// Заменяем статью в ТЗ
Для Каждого СтрокаТЗ Из ТЗ_Движений Цикл
    Если СтрокаТЗ.СтатьяЗатрат = СтараяСтатья Тогда
        СтрокаТЗ.СтатьяЗатрат = НоваяСтатья;
    КонецЕсли;
КонецЦикла;

// Группируем ТЗ по измерениям, суммируя ресурсы (Сумма, СуммаНУ, СуммаПР, СуммаВР)
КлючевыеПоля = "Период, Регистратор, Организация, СтатьяЗатрат, СчетЗатрат, СчетПрямыхЗатрат, Подразделение"; 
// Примечание: состав полей может меняться в зависимости от версии БП, проверьте состав измерений в конфигураторе
Ресурсы = "Сумма, СуммаНУ, СуммаПР, СуммаВР";

ТЗ_Движений.Свернуть(КлючевыеПоля, Ресурсы);

// Загружаем обратно и записываем
НаборЗаписей.Загрузить(ТЗ_Движений);
НаборЗаписей.ОбменДанными.Загрузка = Истина; // Важно для обхода проверок
НаборЗаписей.Записать();

Проанализируем этот код: использование метода Свернуть() позволяет автоматически объединить строки, которые после замены статьи стали идентичными по всем измерениям. Это исключает возникновение ошибки дублирования ключа при вызове метода Записать().

Способ 2. Использование документа «Корректировка записей регистров»

Если вы не хотите писать код, можно воспользоваться штатным механизмом системы. Рассмотрим этот «лайтовый» вариант подробнее. Этот метод подходит, если количество проблемных записей невелико (как в случае автора темы — около 30 записей).

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

Важный нюанс: После того как вы исправите регистр данным документом, стандартная обработка «Поиск и замена дублей» больше не будет спотыкаться на этом регистре, так как ссылок на «старую» статью там не останется.

Способ 3. Радикальный метод (Удаление записей)

Как отметили участники обсуждения на форуме, иногда самым быстрым способом является простое удаление записей по «плохой» статье из регистра. Если бухгалтерии не принципиально хранение истории распределения по удаляемому дублю в справках-расчетах за 2019 год, мы можем просто очистить эти записи.

Выясним причину, почему это безопасно: программа при закрытии нового месяца не обращается к данным этого регистра за прошлые периоды для расчета текущих сумм. Весь расчет строится на остатках и оборотах счетов БУ/НУ (20, 23, 25, 26, 44). Поэтому «дырка» в регистре сведений за прошлый год не сломает текущий учет.

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


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

Индекс = 0;
Пока Индекс < Набор.Количество() Цикл
    Запись = Набор[Индекс];
    Если Запись.СтатьяЗатрат = СтараяСтатья Тогда
        Набор.Удалить(Запись);
    Иначе
        Индекс = Индекс + 1;
    КонецЕсли;
КонецЦикла;
Набор.Записать();

Проверка смежных регистров

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

Если вы исправите только один регистр, справки-расчеты могут начать противоречить друг другу. Например, общая сумма распределения в одном отчете будет сходиться, а в детализации по этапам распределения — нет.

Резюме для программиста и бухгалтера

Подводя итог, проанализируем последовательность действий для безопасного схлопывания дублей:

  1. Бэкап базы: Всегда делайте резервную копию перед манипуляциями с регистрами сведений напрямую.
  2. Определение масштаба: Если дублей мало — используйте Корректировку записей регистров. Если много — программный метод со сворачиванием ТЗ.
  3. Замена в справочнике: Только после того, как все движения в регистрах сведений очищены от ссылок на «плохую» статью, запускайте стандартное удаление дублей. Теперь оно пройдет без ошибок.
  4. Проверка: Сформируйте Справку-расчет за исправленный период. Убедитесь, что итоговая сумма распределения не изменилась, а все затраты теперь числятся на одной «правильной» статье.

Таким образом, проблема решается без перепроведения документов, что критически важно для уже сданной отчетности и закрытых от редактирования периодов.

← На главную