Работа с платформой 1С:Предприятие 7.7 в современных реалиях часто сопряжена с трудностями, так как эта версия является морально устаревшей и не имеет встроенных механизмов для работы с форматами JSON, XML или прямой печати в PDF. Однако задача «выпилить» данные для внешнего сервера (например, для личного кабинета ЖКХ или автоматической рассылки счетов) вполне решаема. Рассмотрим основные способы извлечения информации и формирования документов, которые помогут нам автоматизировать этот процесс.
Если ваша версия 1С 7.7 работает в файловом режиме (а это наиболее частый случай), все данные хранятся в формате DBF. Для их извлечения нам даже не нужно запускать саму программу 1С. Это самый быстрый способ получить «сырые» данные для последующей загрузки в MySQL или другую СУБД.
Проанализируем структуру папки с базой данных. Нам понадобятся следующие файлы:
DH123) конкретным объектам 1С (например, Документ «Счет»).DH123.dbf) — здесь хранятся «шапки» документов: номер, дата, общая сумма, ссылка на контрагента.DT123.dbf) — здесь находятся табличные части документов (перечень услуг, количество, цена).SC456.dbf) — это справочники (наименования организаций, адреса, тарифы).Выясним причину сложности прямой работы: 1С использует внутренние идентификаторы (ID). Например, в файле счета вместо названия компании будет стоять код типа 36PR. Чтобы получить человеческое название, нам нужно программно связать поле из таблицы документов с полем ID в таблице справочника контрагентов.
Пример логики на языке программирования (например, Python или PHP), читающем DBF:
// Псевдокод извлечения данных
Для Каждой Записи Из Файла_DH123 Цикл
Если Запись.ПомеченаНаУдаление Тогда Продолжить; КонецЕсли;
НомерДокумента = Запись.DOCNO;
ДатаДокумента = Запись.DATE;
ID_Контрагента = Запись.SP154; // Поле из 1Cv7.dd
// Ищем имя в справочнике SC
ИмяКлиента = НайтиВТаблицеSC(ID_Контрагента);
КонецЦикла;
Важный нюанс: 1С 7.7 не удаляет записи физически. Первый байт каждой строки в DBF-файле является флагом удаления. Если там стоит звездочка (*) или специальный маркер, эту запись следует игнорировать.
Если нам нужно не просто получить цифры, а именно готовый макет счета, проанализируем возможности штатных инструментов. На диске ИТС (или в архивах сообщества) существует обработка DOCPRINT.ert (Универсальная печать документов).
Разберем по шагам, как она работает:
Основная проблема здесь — интерактивность. 1С 7.7 выводит печатную форму в формате MXL. Чтобы превратить это в Excel или PDF автоматически, потребуется небольшая доработка кода обработки. Рассмотрим, как программно сохранить форму в формате Excel:
// Пример кода для вставки в обработку 7.7
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Счет");
// ... тут идет код заполнения макета данными ...
Таб.ВывестиСекцию("Шапка");
// Сохраняем результат
ПутьКФайлу = "C:\Sids\" + СокрЛП(ТекущийДокумент.НомерДокумента) + ".xls";
Таб.Записать(ПутьКФайлу, "XLS");
Для разработчиков, не знающих внутренний язык 1С, но владеющих другими инструментами, идеально подойдет метод COM-соединения. Мы можем заставить 1С работать в фоновом режиме, отдавая команды из внешнего скрипта.
Посмотрим на пример скрипта (на языке VBScript или Python), который подключается к 1С 7.7 и выгружает данные:
// Инициализация соединения
v7 = CreateObject("V77.Application")
result = v7.Initialize(v7.RMTrade, "/d""C:\PathToBAse"" /nAdmin", "NO_SPLASH_SHOW")
// Создаем объект для выборки документов
Счет = v7.CreateObject("Документ.Счет")
Счет.ВыбратьДокументы(ДатаНачала, ДатаКонца)
Пока Счет.ПолучитьДокумент() = 1 Цикл
Если Счет.ПометкаУдаления() = 0 Тогда
// Получаем данные напрямую из объекта
Номер = Счет.НомерДок
Сумма = Счет.Итог("Сумма")
// Здесь можно отправить данные в MySQL через ADODB
КонецЕсли;
КонецЦикла;
Этот метод позволяет избежать прямого парсинга DBF и гарантирует, что вы получите актуальные данные с учетом всех внутренних пересчетов платформы.
Поскольку 1С 7.7 не умеет сохранять в PDF «из коробки», нам потребуется виртуальный принтер (например, PDFCreator, Bullzip или PDF24). Суть решения заключается в следующем:
Проанализируем ситуацию: если документов сотни, принтер может «захлебнуться». В этом случае в коде 1С рекомендуется делать небольшую паузу между отправкой документов на печать, используя функцию Предупреждение(" ", 1) или внешние компоненты для ожидания.
Подведем итоги нашего исследования:
Таблица.Записать() или печать через виртуальный принтер.DH1234) могут отличаться.Помните, что при работе с DBF напрямую крайне важно учитывать кодировку (обычно это Windows-1251) и формат дат (в 1С 7.7 они хранятся как восьмизначная строка ГГГГММДД). Следуя этим шагам, вы сможете успешно интегрировать старую систему в современный ИТ-ландшафт.