Как получить данные из открытого окна приложения 1С 7.7 в среде 1С 8.2

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В практике сопровождения программных продуктов 1С часто возникает ситуация, когда на предприятии одновременно сосуществуют старые и новые версии платформ. Одной из самых нетривиальных задач является необходимость «подцепить» данные из уже открытого окна 1С 7.7 и передать их в обработку на платформе 1С 8.2. Рассмотрим подробно, какими способами можно реализовать такое взаимодействие, начиная от простых файловых обменов и заканчивая сложными системными вызовами Windows API.

Метод 1: Использование механизма COM-соединения (GetActiveObject)

Проанализируем самый технологичный способ, который позволяет программно обратиться к запущенному экземпляру 1С 7.7. В отличие от создания нового COM-объекта через CreateObject, который запускает новую копию программы, мы можем попытаться подключиться к уже работающему приложению.

Разберем алгоритм действий в 1С 8.2:

  1. Используем попытку подключения к активному объекту 1С 7.7 через COM.
  2. Получаем доступ к глобальному контексту 1С 7.7.
  3. Читаем необходимые данные через атрибуты глобального контекста или созданные объекты.

Посмотрим на пример кода, который может быть использован в 1С 8.2:


Попытка
    V7 = ПолучитьCOMОбъект("", "V77.Application");
    // Если подключение успешно, можно обращаться к метаданным
    СуммаДокумента = V7.Eval("ВвестиЧисло(Сумма)"); // Пример вызова функции
Исключение
    Сообщить("Не удалось подключиться к запущенной 1С 7.7");
КонецПопытки;

Важно помнить, что штатный COM-интерфейс 1С 7.7 ограничен в работе с экранными формами. Мы можем прочитать данные из базы, но получить значение из поля ввода, которое пользователь еще не записал, через стандартный Application бывает затруднительно. Поэтому перейдем к более гибким методам.

Метод 2: Использование Windows API (User32.dll)

Выясним, как «достать» данные напрямую из графического интерфейса Windows. Каждое поле ввода в 1С 7.7 является отдельным оконным элементом. Если мы знаем структуру окон, мы можем считать текст прямо с экрана.

Рассмотрим по шагам, как это работает:

  1. С помощью функции FindWindow находим главное окно 1С 7.7 по его заголовку или классу.
  2. Используем FindWindowEx для перебора дочерних окон (форм и элементов управления).
  3. Для получения текста из поля ввода посылаем окну сообщение WM_GETTEXT через SendMessage.

Проанализируем ситуацию: поля ввода в 1С 7.7 часто имеют специфические классы, например, V7Edit. Нам необходимо программно «пробежаться» по всем элементам формы, пока не найдем тот, чей идентификатор или положение соответствуют полю «Сумма».

Этот метод является самым сложным, так как требует регистрации внешних библиотек или использования ВызовDLL, но он позволяет получить данные, которые еще не сохранены в файл или базу данных.

Метод 3: Внешние компоненты и расширение FormEx

Для платформы 1С 7.7 существует легендарное расширение FormEx. Разберем, как оно может помочь в нашей задаче. Данная компонента позволяет перехватывать события формы и взаимодействовать с объектами на низком уровне.

Мы можем настроить 1С 7.7 так, чтобы при изменении суммы в документе программа записывала это значение в определенное место, доступное для 1С 8.2:

Метод 4: Файловый обмен (простой и надежный путь)

Если нет возможности использовать сложные системные вызовы, рассмотрим вариант с промежуточным файлом, предложенный в обсуждении на форуме. Это может показаться «извращением», но в условиях ограниченного времени разработки это самый стабильный метод.

Алгоритм взаимодействия:

  1. В 1С 7.7 создаем небольшую процедуру (можно повесить на кнопку или на событие ПриЗаписи), которая выгружает текущую сумму в текстовый файл или таблицу Excel.
  2. В 1С 8.2 запускаем обработчик, который проверяет наличие этого файла в определенной папке.
  3. Считываем данные и удаляем файл.

Пример кода для 1С 7.7 для записи в текстовый файл:


Текст = СоздатьОбъект("Текст");
Текст.ДобавитьСтроку(Строка(СуммаДокумента));
Текст.Записать("C:\Exchange\sum.txt");

В 1С 8.2 мы используем объект ТекстовыйДокумент для чтения этого файла. Посмотрим на реализацию:


Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("C:\Exchange\sum.txt");
Если Текст.КоличествоСтрок() > 0 Тогда
    Сумма = Число(Текст.ПолучитьСтроку(1));
КонецЕсли;

Метод 5: Прямое чтение базы данных (SQL/DBF)

Проанализируем ситуацию, когда документ в 1С 7.7 уже нажат пользователем (кнопка «Записать» или «ОК»). В этом случае данные уже попали в таблицы базы данных. Нам не нужно «мучить» интерфейс 1С 7.7, мы можем забрать данные напрямую.

Если 1С 7.7 работает на MS SQL Server:

Используем ADO-соединение из 1С 8.2. Нам нужно знать имя таблицы (например, _1SJOURN для журнала и DH123 для шапки документа). Выясним ID документа и выполним прямой запрос:


Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open("Driver={SQL Server};Server=MyServer;Database=Base77;Uid=sa;Pwd=123;");
Recordset = Connection.Execute("SELECT SP125 FROM DH123 WHERE IDDOC='XXXXX'");
Сумма = Recordset.Fields("SP125").Value;

Если 1С 7.7 файловая (DBF):

Используем драйвер Microsoft dBase Driver или специализированные объекты 1С для работы с DBF-файлами. Логика остается такой же: находим нужный файл таблицы и читаем поле суммы по идентификатору документа.

Метод 6: Технология DDE (Dynamic Data Exchange)

Хотя технология DDE считается устаревшей, она до сих пор поддерживается платформой 1С 7.7. Мы можем настроить канал передачи данных, где 1С 7.7 будет выступать сервером, а 1С 8.2 — клиентом. Это позволяет передавать значения практически мгновенно в оперативной памяти без создания временных файлов.

Выводы и рекомендации

Подведем итог нашему анализу. Выбор метода зависит от ваших навыков и требований к скорости:

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

← На главную