При работе в среде 1С 7.7 разработчики часто сталкиваются с проблемой: при стандартном сохранении печатной формы в формат Excel (.xls) с помощью метода Таб.Записать(ИмяФайла, 1), платформа пытается автоматически определить типы данных. В результате артикулы или коды поставщиков вида 072.0012 превращаются в числа 72,0012. Лидирующие нули исчезают, а точка заменяется запятой (согласно региональным настройкам Windows). Рассмотрим, как обойти это ограничение и гарантировать сохранение исходного строкового значения.
Разберем ситуацию: метод Записать() в формате 1 (Excel) является «черным ящиком». Он берет визуальное представление ячейки из таблицы 1С и пытается сопоставить его с типами данных Excel. Если содержимое похоже на число, Excel (или движок сохранения 1С) преобразует его в числовой формат. Поскольку для поставщика или системы учета код 072.0012 и число 72,0012 — это принципиально разные значения, нам необходимо заставить Excel воспринимать эти данные исключительно как текст.
Наиболее надежный и гибкий способ — это отказ от штатного метода сохранения в пользу прямого управления приложением Excel через механизм COM. Это позволяет нам программно задать формат ячеек до того, как в них попадут данные. Проанализируем основной алгоритм решения:
Excel.Application.@).Рассмотрим пример кода, реализующий этот подход:
// Создаем связь с Excel
ОкноЕхсеl = СоздатьОбъект("Excel.Application");
КнигаExcel = ОкноЕхсеl.Workbooks.Add;
Лист = КнигаExcel.Worksheets(1);
// Предположим, у нас есть список товаров
КоличествоСтрок = ТаблицаЗначений.КоличествоСтрок();
// Сначала задаем текстовый формат для всей колонки, где будут коды (например, колонка 2)
// Это критически важно сделать ДО заполнения данными
Диапазон = Лист.Range(Лист.Cells(1, 2), Лист.Cells(КоличествоСтрок + 1, 2));
Диапазон.NumberFormat = "@";
// Заполняем строки
ТаблицаЗначений.ВыбратьСтроки();
Ном = 0;
Пока ТаблицаЗначений.ПолучитьСтроку() = 1 Цикл
Ном = Ном + 1;
// Записываем код как строку, добавляя пустую строку для надежности
Лист.Cells(Ном, 2).Value = "" + СокрЛП(ТаблицаЗначений.КодПоставщика);
Лист.Cells(Ном, 1).Value = ТаблицаЗначений.Наименование;
КонецЦикла;
// Сохраняем и закрываем
КнигаExcel.SaveAs("C:\MyData.xls");
ОкноЕхсеl.Quit();
При использовании Excel.Application программисты часто жалуются на низкую скорость работы. Если выгружать данные поячеечно в цикле (как в примере выше), процесс может затянуться на тысячи строк. Посмотрим, как можно ускорить работу:
Форматирование всей области сразу. Вместо того чтобы форматировать каждую ячейку в цикле, выделите весь Range одной командой, как показано выше: Range(...).NumberFormat = "@". Это значительно экономит время на обращениях к COM-интерфейсу.
Использование визуальных настроек ячейки. Интересное наблюдение было высказано коллегами: иногда Excel корректнее распознает типы, если в самой 1С в свойствах ячейки установлено выравнивание (например, «По центру» или «По горизонтали»). Однако полагаться только на это не стоит, лучше использовать явное указание формата "@".
Рассмотрим еще один способ, который часто применяют «по старинке». Если в начало значения добавить символ одинарной кавычки (апостроф '), Excel автоматически воспримет содержимое ячейки как текст.
Пример формирования значения:
ЗначениеДляExcel = "'" + СокрЛП(КодТовара);
Важное уточнение: хотя Excel скрывает этот апостроф в самой ячейке, при программном считывании этого файла другим софтом или макросом, апостроф может остаться в строке данных. Если ваш поставщик загружает файл автоматически, это может привести к ошибке сопоставления. Поэтому метод с NumberFormat = "@" является более чистым и профессиональным.
Выясним еще одну хитрость, которая работает в 1С 7.7. Вместо формата Excel можно использовать сохранение в HTML: Таб.Записать(ИмяФайла, "HTML"). Excel прекрасно открывает такие файлы. Если в макете 1С в свойствах расшифровки или в текстовом поле указать специфические CSS-стили, Excel применит их.
Например, если в HTML-коде ячейки будет присутствовать атрибут стиля mso-number-format:"\@", это заставит Excel считать ячейку текстовой. Однако этот метод требует более глубокой работы с шаблоном и понимания того, как движок 1С формирует HTML-теги.
Подводя итоги, если вам необходимо гарантировать точность данных (сохранение точек вместо запятых и лидирующих нулей), придерживайтесь следующих правил:
Таб.Записать(..., 1) для критически важных данных, требующих строгого форматирования.NumberFormat = "@" для колонок с кодами, артикулами и штрихкодами до момента их заполнения."" + Значение.Такой подход сделает вашу выгрузку независимой от региональных настроек компьютера пользователя и гарантирует, что поставщик получит данные в том виде, в котором они хранятся в вашей базе 1С.