Как выгрузить реквизиты всех документов из 1С 7.7 в Excel?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

Перенос данных из устаревших конфигураций 1С:Предприятие 7.7 в современные системы (например, на платформу 8.3) — это классическая задача, с которой сталкиваются многие специалисты. Основная сложность заключается в том, что стандартные журналы документов в "семерке" позволяют вывести на печать только реестр, где вместо детальных значений реквизитов зачастую выводятся лишь текстовые представления или ссылки. Рассмотрим детально, как решить задачу полной выгрузки всех данных документа (включая шапку и табличные части) в формат Excel.

Анализ структуры данных: Документ или Справочник?

Перед тем как приступать к выгрузке, проанализируем специфику вашей конфигурации. В типовых решениях 1С 7.7 объект Договоры обычно является справочником. Однако в самописных конфигурациях разработчики иногда создают документ Договор для фиксации конкретных условий сделки во времени. Это важно, так как методы программного доступа к справочникам и документам в языке 1С 7.7 различаются. Выясним, с чем именно мы работаем, заглянув в Конфигуратор, и убедимся, что объект находится в ветке "Документы".

Способ 1: Использование штатных обработок с диска ИТС

Самый простой путь, не требующий написания кода, — использование проверенных временем сервисных инструментов. Разберем работу со штатными обработками, которые входили в состав дисков ИТС (Информационно-технологического сопровождения) и часто копировались в папку ExtForms баз данных. Нам понадобятся следующие файлы:

  1. DOCPRINT.ERT — универсальная обработка печати документов. Она позволяет выбрать вид документа и сформировать таблицу со всеми реквизитами шапки.
  2. DLGQUERY.ERT — служебная обработка, реализующая функционал построения запросов и вывода данных.

Эти инструменты позволяют сформировать печатную форму, которую затем можно сохранить как таблицу Excel штатными средствами 1С (меню "Файл" — "Сохранить как").

Способ 2: Программный обход документов через встроенный язык

Если готовые обработки не подходят из-за специфической структуры документа, нам придется написать небольшую процедуру. Разберем по шагам, как правильно организовать выборку всех документов определенного вида. Важно помнить, что в отличие от 1С 8.x, в 7.7 мы используем объектный метод ВыбратьДокументы().

Проанализируем пример кода для выборки данных из шапки документа:


Процедура ВыгрузитьДоговоры()
    Док = СоздатьОбъект("Документ.Договор");
    // Выбираем документы за весь период работы базы
    Док.ВыбратьДокументы('01.01.1900', РабочаяДата());
    
    Пока Док.ПолучитьДокумент() = 1 Цикл
        // Проверяем, не помечен ли документ на удаление
        Если Док.ПометкаУдаления() = 1 Тогда
            Продолжить;
        КонецЕсли;
        
        // Пример получения конкретных реквизитов
        Сообщить("Номер: " + Док.НомерДок + " Дата: " + Док.ДатаДок);
        Сообщить("Контрагент: " + Док.Контрагент);
        // Здесь должен быть код записи в таблицу или Excel
    КонецЦикла;
КонецПроцедуры

Способ 3: Универсальная выгрузка через метаданные

Чтобы не прописывать имя каждого реквизита вручную (особенно если в самописной конфигурации их десятки), воспользуемся объектом Метаданные. Это позволит нам автоматически определить все доступные колонки. Рассмотрим, как программно перечислить все реквизиты шапки документа:


// Получаем количество реквизитов шапки документа "Договор"
КолвоРеквизитов = Метаданные.Документ("Договор").РеквизитШапки();

Для и = 1 По КолвоРеквизитов Цикл
    ИмяРеквизита = Метаданные.Документ("Договор").РеквизитШапки(и).Идентификатор;
    Синоним = Метаданные.Документ("Договор").РеквизитШапки(и).Представление;
    
    // Получаем значение реквизита универсально
    Значение = Док.ПолучитьАтрибут(ИмяРеквизита);
    // Теперь это значение можно отправить в соответствующую колонку Excel
КонецЦикла;

Такой подход делает вашу обработку по-настоящему универсальной: она будет работать для любого типа документа без изменения исходного кода.

Способ 4: Выгрузка табличной части документа

Если данные хранятся не только в шапке, но и в табличной части, нам нужно добавить вложенный цикл. Проанализируем ситуацию: в 1С 7.7 для работы со строками документа используется метод ВыбратьСтроки(). Посмотрим на пример реализации:


Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
    // Обходим реквизиты табличной части
    КолвоРеквТЧ = Метаданные.Документ("Договор").РеквизитТабличнойЧасти();
    Для к = 1 По КолвоРеквТЧ Цикл
        ИмяРеквТЧ = Метаданные.Документ("Договор").РеквизитТабличнойЧасти(к).Идентификатор;
        ЗначениеТЧ = Док.ПолучитьАтрибут(ИмяРеквТЧ);
        // Запись в файл
    КонецЦикла;
КонецЦикла;

Способ 5: Прямое чтение файлов базы данных (DBF)

В исключительных случаях, когда база повреждена или слишком велика для медленных объектных методов 1С 7.7, можно прибегнуть к чтению таблиц напрямую. Если ваша база данных файловая (DBF), информация о документах хранится в следующих файлах:

Где **** — это внутренний идентификатор объекта, который можно найти в файле 1cv7.dd в каталоге базы. Выяснив структуру, вы можете открыть эти файлы любым внешним инструментом (например, Excel или DBF-редактор) и получить "сырые" данные. Однако помните, что ссылки на другие объекты (справочники, перечисления) в этом случае будут представлены в виде внутренних ID (36-ричных строк), которые потребуют дополнительной расшифровки.

Рекомендации по выводу в Excel

Для записи данных в Excel из 1С 7.7 рекомендуем использовать один из двух подходов:

  1. Через COM-объект Excel.Application: Позволяет создавать файлы .xls напрямую, управлять форматированием и листами. Требует установленного Microsoft Excel на компьютере.
  2. Формирование CSV-файла: Самый быстрый и надежный способ. Мы записываем данные в текстовый файл с разделителями (например, точка с запятой), который Excel открывает как полноценную таблицу. Это исключает проблемы с совместимостью версий и не требует наличия установленного офисного пакета на сервере.

Важный совет: При выгрузке данных для переноса в 1С 8.x обязательно выгружайте уникальный идентификатор документа (в 7.7 это можно сделать через функцию ЗначениеВСтрокуВнутр(Док.ТекущийДокумент())). Это поможет вам избежать дублей при повторных загрузках и правильно сопоставить связанные данные.

← На главную