В процессе сопровождения конфигурации 1С:Бухгалтерия предприятия 3.0 часто возникает необходимость наведения порядка в справочниках. Одной из самых трудоемких задач является удаление дублей в справочнике Статьи затрат. Когда мы запускаем стандартную обработку «Поиск и замена дублей», система анализирует ссылки во всей базе данных и пытается заменить «плохую» статью на «хорошую».
Однако на этапе записи изменений в регистр сведений Расчет списания косвенных расходов мы часто сталкиваемся с системной ошибкой: «Запись с такими ключевыми полями существует». Это происходит потому, что в данном регистре статья затрат входит в состав уникального ключа записи. Если в рамках одного расчетного периода (месяца) и одного документа «Регламентная операция» обе статьи (и дубль, и оригинал) уже принимали участие в распределении затрат, то при попытке замены одной статьи на другую программа пытается создать две абсолютно идентичные записи, что запрещено правилами платформы 1С.
В этой статье мы подробно разберем, как решить эту проблему, не прибегая к опасному перепроведению закрытых периодов, и выясним, на что влияют данные этого регистра.
Прежде чем приступать к программным действиям, проанализируем, за что отвечает регистр Расчет списания косвенных расходов. Этот регистр является вспомогательным (расчетным). Его основное предназначение — хранение промежуточных и итоговых данных для формирования печатных форм «Справка-расчет», которые бухгалтер открывает по гиперссылке из помощника закрытия месяца.
Важные выводы:
Хозрасчетный.Расчет списания косвенных расходов не приведет к искажению налоговой отчетности.Этот вариант является наиболее правильным с точки зрения сохранения целостности данных. Мы программно пересчитаем движения регистра по конкретным регистраторам (документам закрытия месяца), где возникли дубли. Рассмотрим пошаговый алгоритм решения задачи.
Суть метода заключается в том, чтобы выбрать все записи регистра по конкретному документу-регистратору, заменить в них «старую» статью на «новую», а затем свернуть таблицу по ключевым полям, просуммировав числовые ресурсы.
Пример кода для реализации такой обработки:
// Определяем параметры: Регистратор и Статьи
СтараяСтатья = Справочники.СтатьиЗатрат.НайтиПоНаименованию("Дубль");
НоваяСтатья = Справочники.СтатьиЗатрат.НайтиПоНаименованию("Оригинал");
// Получаем набор записей по конкретному документу
НаборЗаписей = РегистрыСведений.РасчетСписанияКосвенныхРасходов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаРегистратор);
НаборЗаписей.Прочитать();
// Выгружаем в ТЗ для удобства манипуляций
ТЗ_Движений = НаборЗаписей.Выгрузить();
// Заменяем статью в ТЗ
Для Каждого СтрокаТЗ Из ТЗ_Движений Цикл
Если СтрокаТЗ.СтатьяЗатрат = СтараяСтатья Тогда
СтрокаТЗ.СтатьяЗатрат = НоваяСтатья;
КонецЕсли;
КонецЦикла;
// Группируем ТЗ по измерениям, суммируя ресурсы (Сумма, СуммаНУ, СуммаПР, СуммаВР)
КлючевыеПоля = "Период, Регистратор, Организация, СтатьяЗатрат, СчетЗатрат, СчетПрямыхЗатрат, Подразделение";
// Примечание: состав полей может меняться в зависимости от версии БП, проверьте состав измерений в конфигураторе
Ресурсы = "Сумма, СуммаНУ, СуммаПР, СуммаВР";
ТЗ_Движений.Свернуть(КлючевыеПоля, Ресурсы);
// Загружаем обратно и записываем
НаборЗаписей.Загрузить(ТЗ_Движений);
НаборЗаписей.ОбменДанными.Загрузка = Истина; // Важно для обхода проверок
НаборЗаписей.Записать();
Проанализируем этот код: использование метода Свернуть() позволяет автоматически объединить строки, которые после замены статьи стали идентичными по всем измерениям. Это исключает возникновение ошибки дублирования ключа при вызове метода Записать().
Если вы не хотите писать код, можно воспользоваться штатным механизмом системы. Рассмотрим этот «лайтовый» вариант подробнее. Этот метод подходит, если количество проблемных записей невелико (как в случае автора темы — около 30 записей).
Корректировка записей регистров (находится в разделе «Операции»).Расчет списания косвенных расходов.Статья затрат.Важный нюанс: После того как вы исправите регистр данным документом, стандартная обработка «Поиск и замена дублей» больше не будет спотыкаться на этом регистре, так как ссылок на «старую» статью там не останется.
Как отметили участники обсуждения на форуме, иногда самым быстрым способом является простое удаление записей по «плохой» статье из регистра. Если бухгалтерии не принципиально хранение истории распределения по удаляемому дублю в справках-расчетах за 2019 год, мы можем просто очистить эти записи.
Выясним причину, почему это безопасно: программа при закрытии нового месяца не обращается к данным этого регистра за прошлые периоды для расчета текущих сумм. Весь расчет строится на остатках и оборотах счетов БУ/НУ (20, 23, 25, 26, 44). Поэтому «дырка» в регистре сведений за прошлый год не сломает текущий учет.
Для реализации этого метода достаточно выполнить следующий код:
Набор = РегистрыСведений.РасчетСписанияКосвенныхРасходов.СоздатьНаборЗаписей();
// В цикле по регистраторам, где есть дубли:
Набор.Отбор.Регистратор.Установить(СсылкаНаРегистратор);
Набор.Прочитать();
Индекс = 0;
Пока Индекс < Набор.Количество() Цикл
Запись = Набор[Индекс];
Если Запись.СтатьяЗатрат = СтараяСтатья Тогда
Набор.Удалить(Запись);
Иначе
Индекс = Индекс + 1;
КонецЕсли;
КонецЦикла;
Набор.Записать();
Разберем еще один важный момент, который часто упускают из виду. Статьи затрат могут дублироваться не только в регистре Расчет списания косвенных расходов. Рекомендуем также проверить следующие регистры:
Расчет распределения косвенных расходов;Доли списания косвенных расходов;Методы распределения общепроизводственных и общехозяйственных расходов (здесь статья может быть в настройках).Если вы исправите только один регистр, справки-расчеты могут начать противоречить друг другу. Например, общая сумма распределения в одном отчете будет сходиться, а в детализации по этапам распределения — нет.
Подводя итог, проанализируем последовательность действий для безопасного схлопывания дублей:
Корректировку записей регистров. Если много — программный метод со сворачиванием ТЗ.Таким образом, проблема решается без перепроведения документов, что критически важно для уже сданной отчетности и закрытых от редактирования периодов.