Часто при переносе остатков или сверке данных между базами 1С, например, при обмене между Управление торговлей и Комплексная автоматизация, разработчики сталкиваются с тем, что автоматизированная проверка в 1С показывает значительно больше расхождений, чем ручная проверка в Excel через ВПР. Давайте разберем, почему так происходит и как правильно организовать алгоритм сверки, чтобы избежать ошибок.
Первое, что необходимо понять: 1С и Excel работают с данными принципиально по-разному. В то время как Excel может визуально «схлопывать» похожие строки, 1С требует строгой идентичности типов данных и значений. Рассмотрим основные причины возникновения «лишних» расхождений:
СправочникСсылка.Номенклатура в разных базах имеют разные УникальныйИдентификатор (GUID). Ссылка из базы УТ не является валидной для базы КА.ТЗ.Свернуть() в 1С сработает только если все поля, не участвующие в суммировании, абсолютно идентичны.Чтобы сверка была корректной, откажитесь от сравнения по наименованиям. Наименование — это справочная информация, которая может меняться. Для целей программирования используйте уникальные ключи.
Если базы связаны обменом, всегда используйте GUID или Код номенклатуры. Если обмен настроен не через стандартные планы обмена, при выгрузке в ТаблицаЗначений обязательно сохраняйте УникальныйИдентификатор объекта.
Если вы вынуждены сравнивать по текстовым полям (например, по наименованию), обязательно применяйте функции очистки строк перед добавлением в ТаблицаЗначений. Рассмотрим пример того, как это реализовать:
// Функция для очистки строки от лишних символов
Функция НормализоватьСтроку(Знач ВходнаяСтрока)
// Удаляем непечатные символы, табуляцию и лишние пробелы
ВходнаяСтрока = СтрЗаменить(ВходнаяСтрока, Символы.ПС, "");
ВходнаяСтрока = СтрЗаменить(ВходнаяСтрока, Символы.Таб, "");
ВходнаяСтрока = СокрЛП(ВходнаяСтрока);
Возврат ВходнаяСтрока;
КонецФункции
Применяя СокрЛП(), вы удаляете пробелы в начале и конце, что является самой частой причиной сбоев в работе метода Свернуть().
Вместо метода ТЗ.Свернуть() с использованием отрицательных значений, который часто приводит к ошибкам из-за несовпадения типов, воспользуйтесь механизмом Запрос с использованием временных таблиц. Это позволит выполнить соединение баз по четким критериям.
Рассмотрим структуру такого запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗ_УТ.Номенклатура КАК Номенклатура,
| ТЗ_УТ.Остаток КАК ОстатокУТ
|ПОМЕСТИТЬ ВТ_ОстаткиУТ
|ИЗ &ТЗ_УТ КАК ТЗ_УТ
|;
|ВЫБРАТЬ
| ВТ_ОстаткиУТ.Номенклатура,
| ВТ_ОстаткиУТ.ОстатокУТ - ЕСТЬNULL(ТЗ_КА.Остаток, 0) КАК Разница
|ИЗ ВТ_ОстаткиУТ КАК ВТ_ОстаткиУТ
|ЛЕВОЕ СОЕДИНЕНИЕ &ТЗ_КА КАК ТЗ_КА
|ПО ВТ_ОстаткиУТ.Номенклатура = ТЗ_КА.Номенклатура";
Чтобы свести количество ошибок к минимуму, придерживайтесь следующих правил:
Ссылка, Код или Артикул.Свернуть(), убедитесь, что структура колонок ТаблицаЗначений полностью идентична в обеих выборках.Номенклатура в обеих базах.СокрЛП() для всех строковых представлений перед записью в таблицу сверки, чтобы исключить влияние «мусорных» пробелов.Выполнив эти шаги, вы увидите, что количество расхождений значительно сократится, и вы сможете сосредоточиться на поиске реальных причин разницы в остатках, а не на борьбе с некорректным сравнением типов.