При выгрузке данных из 1С в Excel разработчики часто сталкиваются с неприятной особенностью: пустые даты в 1С (значение 01.01.0001 0:00:00) отображаются в Excel как набор нулей, тире или конкретная дата начала летоисчисления платформы. Для конечного пользователя это выглядит как ошибка или лишний шум в документе. В этой статье мы подробно разберем, как добиться идеально чистых ячеек в Excel, если дата в системе не заполнена.
В платформе 1С:Предприятие тип данных Дата всегда содержит значение. "Пустая" дата — это техническое представление начала времен в понимании системы, а именно 01.01.0001 00:00:00. Когда мы передаем это значение в ячейку Excel через механизмы записи или COM-соединение, Microsoft Excel пытается интерпретировать его согласно своим правилам форматирования. В зависимости от настроек ячейки, пользователь видит либо "01.01.0001", либо "00.01.1900", либо просто прочерк. Наша задача — перехватить это значение до момента записи.
Самый прямой и надежный способ — это проверка значения переменной перед тем, как отправить её в функцию записи. Рассмотрим пример кода, который часто используется в обработках выгрузки. Мы проанализируем ситуацию, когда данные обходятся в цикле по строкам и колонкам.
Если мы просто будем передавать значение как есть, мы получим заполненную ячейку. Чтобы этого избежать, добавим проверку на соответствие пустой дате 1С:
Н = 1;
Для каждого Колонка Из СтруктураДанных.МассивКолонок Цикл
ЗаписатьВЯчейку(7, Н, Колонка, ТабДок1);
М = 8;
Для каждого Строка Из Таблица Цикл
// Проверяем, заполнена ли дата в текущей строке
Если Строка[Колонка] <> '00010101000000' Тогда
ЗаписатьВЯчейку(М, Н, СокрЛП(Строка[Колонка]), ТабДок1);
КонецЕсли;
М = М + 1;
КонецЦикла;
Н = Н + 1;
КонецЦикла;
В данном примере мы используем сравнение с литералом даты '00010101000000'. Если условие не выполняется (дата пустая), процедура ЗаписатьВЯчейку просто не вызывается, и ячейка остается пустой. Важно: этот метод подходит, если ячейка в Excel изначально не имеет предустановленного значения в шаблоне.
Более современным и "чистым" с точки зрения стандартов кодирования 1С является использование встроенной функции ЗначениеЗаполнено(). Она универсальна и работает быстрее, чем сравнение с литералом, особенно в больших циклах.
Давайте проанализируем, как изменится наш подход:
ТекущееЗначение = Строка[Колонка];
Если ЗначениеЗаполнено(ТекущееЗначение) Тогда
ЗаписатьВЯчейку(М, Н, СокрЛП(ТекущееЗначение), ТабДок1);
Иначе
// Если нужно гарантированно очистить ячейку (например, при перезаписи шаблона)
ЗаписатьВЯчейку(М, Н, "", ТабДок1);
КонецЕсли;
Здесь мы явно указываем, что если значение не заполнено, в ячейку записывается пустая строка "". Это исключает появление любых символов в документе Excel.
Если вы хотите, чтобы код выглядел лаконично и не содержал лишних конструкций Если...КонецЕсли, можно воспользоваться мощным механизмом форматных строк 1С. У функции Формат() есть специальный параметр ДП (Данные Пустые).
Рассмотрим по шагам, как это работает:
ДФ=dd.MM.yyyy задает формат вывода даты.ДП='' (два апострофа) указывает системе, что если дата пустая, нужно вернуть пустую строку.Пример применения в коде:
РезультатВывода = Формат(Строка[Колонка], "ДФ=dd.MM.yyyy; ДП=");
ЗаписатьВЯчейку(М, Н, РезультатВывода, ТабДок1);
В этом случае 1С сама проверит дату: если она заполнена — отформатирует ее красиво (например, "25.12.2023"), а если нет — вернет абсолютно пустую строку, которая в Excel превратится в чистую ячейку.
Если вы формируете отчет или печатную форму в 1С, которую пользователь затем сохраняет в Excel через команду "Сохранить как", можно настроить свойства ячейки непосредственно в макете или программно через объект ОбластьЯчеекТабличногоДокумента.
Выясним, какие свойства на это влияют:
ДП=.Текст вместо Значение для пустых дат.Проанализируем программный метод очистки области:
Область = ТабДок1.Область(М, Н);
Если Не ЗначениеЗаполнено(ВыбраннаяДата) Тогда
Область.Очистить(); // Полностью очищает ячейку, включая значения и форматы
КонецЕсли;
Если ваша обработка работает напрямую с объектом Excel (через Новый COMОбъект("Excel.Application")), ситуация усложняется. Excel может автоматически преобразовать пустую строку обратно в дату или число. Чтобы этого не произошло, перед записью значения рекомендуется установить текстовый формат для ячейки.
Посмотрим на пример работы с COM:
Лист = ExcelОбъект.ActiveSheet;
Ячейка = Лист.Cells(М, Н);
Если ЗначениеЗаполнено(ДатаДляЗаписи) Тогда
Ячейка.Value = ДатаДляЗаписи;
Иначе
Ячейка.NumberFormat = "@"; // Устанавливаем текстовый формат
Ячейка.Value = ""; // Записываем пустоту
КонецЕсли;
Это гарантирует, что Excel не применит свою внутреннюю логику к пустой ячейке и не подставит туда "00.01.1900".
Мы рассмотрели несколько подходов к решению проблемы пустых дат. Наиболее предпочтительным для большинства задач в 1С 8.3 является использование функции Формат() с параметром ДП= или предварительная проверка через ЗначениеЗаполнено(). Это обеспечивает корректную выгрузку данных и чистоту результирующего файла Excel, что критически важно для бухгалтерских и управленческих отчетов.