Работа с общими формами в 1С:Предприятие 8.3 — одна из самых востребованных задач как для разработчиков, так и для опытных пользователей. Эти формы служат универсальным инструментом для ввода, редактирования и отображения данных, но не всегда очевидно, как извлечь из них информацию для дальнейшей обработки. В отличие от стандартных документов или справочников, общие формы часто требуют специальных подходов — от простого копирования в буфер обмена до сложных программных запросов.
В этой статье мы разберём 5 проверенных способов получения данных из общих форм, включая методы без программирования (для бухгалтеров и менеджеров) и продвинутые техники для разработчиков с примерами кода. Особое внимание уделим типичным ошибкам, которые приводят к потере данных или сбоям в работе системы. Вы узнаете, как обойти ограничения платформы, автоматизировать экспорт в Excel или JSON, и почему иногда проще использовать внешние обработки вместо встроенных механизмов.
Материал актуален для всех современных конфигураций на базе 1С:Предприятие 8.3 (включая Бухгалтерию 3.0, УТ 11, ЗУП 3.1 и кастомизированные решения). Если вы работаете с устаревшими версиями (8.2 или ниже), часть методов может потребовать адаптации — об этом мы тоже упомянем в соответствующих разделах.
1. Что такое общая форма в 1С и где хранятся её данные
Общая форма в 1С:Предприятие — это универсальный объект конфигурации, который позволяет создавать диалоговые окна для работы с данными без привязки к конкретному справочнику или документу. Она может содержать:
- 📋 Реквизиты (поля для ввода текста, чисел, дат)
- 📊 Табличные части (списки строк с данными)
- 🔄 Командные панели (кнопки для выполнения действий)
- 🖼️ Элементы управления (флажки, переключатели, списки выбора)
Данные общей формы не хранятся в базе напрямую — они временно существуют в оперативной памяти во время работы пользователя. Это ключевое отличие от документов или справочников, которые сохраняются в таблицах базы данных. Например, если пользователь заполнил общую форму заказа, но не нажал "Сохранить", информация исчезнет после закрытия формы.
Где же тогда брать данные? Есть три основных источника:
- Реквизиты формы — значения полей, которые пользователь ввёл или которые были загружены программно.
- Табличные части — строки данных, аналогичные таблицам в документах.
- Модуль формы — программный код, который может содержать логику обработки данных.
Важно понимать, что общие формы часто используются как "промежуточный слой" между пользователем и базой данных. Например, в конфигурации Управление торговлей 11 общая форма может служить для массового ввода цен номенклатуры, но сами цены хранятся в регистре сведений. Поэтому перед извлечением данных нужно определить, являются ли они:
- 🔹 Временными (только для текущей сессии)
- 🔹 Связанными с базой (сохраняются в таблицах при нажатии "ОК")
- 🔹 Вычисляемыми (формируются динамически по алгоритму)
2. Способ 1: Копирование данных в буфер обмена (без программирования)
Самый простой метод, который доступен любому пользователю — это ручное копирование данных из формы в буфер обмена с последующей вставкой в Excel или текстовый документ. Он подходит для одноразовых задач, когда нужно быстро получить небольшой объём информации.
Пошаговая инструкция:
- Откройте общую форму с нужными данными.
- Выделите мышью табличную часть или реквизиты, которые требуется скопировать.
- Нажмите
Ctrl + C(или правой кнопкой → "Копировать"). - Вставьте данные в Excel (
Ctrl + V) или текстовый редактор.
Этот способ работает для большинства стандартных форм, но имеет ограничения:
- ❌ Не копируются скрытые колонки таблиц.
- ❌ Данные вставляются как текст — форматирование (даты, числа) может сломаться.
- ❌ Не подходит для больших объёмов (например, 10 000 строк).
Если при копировании из 1С в Excel даты отображаются как числа (например, 44197 вместо 01.01.2021), используйте функцию =ТЕКСТ(A1;"ДД.ММ.ГГГГ") для преобразования.
Для табличных частей с большим количеством колонок можно использовать расширенное копирование:
- Кликните правой кнопкой по заголовку таблицы.
- Выберите "Копировать с заголовками".
- В Excel используйте "Специальная вставка" → "Текст" для сохранения структуры.
Открыта нужная общая форма|Выделены все необходимые строки/колонки|Проверено, что нет скрытых данных|Подготовлен документ для вставки (Excel/Notepad++)|Сделан резервный скриншот формы (на случай сбоя)-->
3. Способ 2: Экспорт через "Все действия" → "Выгрузить данные"
Многие общие формы в стандартных конфигурациях (например, Бухгалтерия 3.0 или ЗУП 3.1) поддерживают встроенную функцию выгрузки данных. Она позволяет сохранить информацию в форматах Excel, XML или TXT без программирования.
Как найти эту функцию:
- Откройте общую форму.
- Нажмите на кнопку "Все действия" (обычно в правом верхнем углу формы).
- В выпадающем меню найдите пункты:
- 📑 "Выгрузить данные"
- 📊 "Экспортировать в Excel"
- 📄 "Сохранить как..."
Преимущества этого метода:
- ✅ Сохраняет структуру данных (колонки, иерархию).
- ✅ Поддерживает большие объёмы (до сотен тысяч строк).
- ✅ Можно настроить параметры выгрузки (разделители, кодировку).
Однако есть и нюансы:
- ⚠️ Не все общие формы поддерживают эту функцию (зависит от конфигурации).
- ⚠️ Иногда выгружаются не все данные (например, скрытые колонки или служебные поля).
- ⚠️ В Excel может не сохраняться форматирование ячеек (цвета, шрифты).
Что делать, если в меню "Все действия" нет пункта "Выгрузить данные"?
Если стандартная выгрузка недоступна, попробуйте:
1. Использовать внешнюю обработку (например, "Универсальный экспорт в Excel").
2. Нажать Alt + F12 для открытия окна отладки и вручную вызвать метод Экспортировать() для таблицы.
3. Обратиться к администратору 1С для добавления кнопки выгрузки в форму.
Пример выгрузки из формы "Список номенклатуры" в Управлении торговлей 11:
| Действие | Результат |
|---|---|
| Все действия → Выгрузить данные → Excel | Файл Номенклатура.xlsx с колонками: Артикул, Наименование, Цена |
| Все действия → Выгрузить данные → TXT (разделитель - табуляция) | Файл Номенклатура.txt для импорта в другие системы |
| Все действия → Печать → Сохранить как PDF | PDF-документ с визуальным отображением формы |
4. Способ 3: Программное получение данных через модуль формы
Для разработчиков и опытных пользователей, владеющих 1С:Предприятие на уровне конфигуратора, доступен метод извлечения данных через модуль формы. Этот способ позволяет получить полный контроль над данными, включая скрытые поля и вычисляемые значения.
Основные объекты для работы:
- 📝
ЭтотОбъект— текущая форма. - 📊
ЭлементыФормы[ИмяТаблицы]— табличная часть. - 🔧
РеквизитФормы[ИмяРеквизита]— отдельное поле.
Пример кода для получения данных из табличной части формы:
// Получаем табличную часть "Товары" из формы
ТаблицаТоваров = ЭлементыФормы.Товары;
// Проходим по всем строкам
Для Каждого Строка Из ТаблицаТоваров Цикл
Сообщить(Строка.Номенклатура + " | " + Строка.Количество + " | " + Строка.Цена);
КонецЦикла;
Чтобы сохранить данные в файл, можно использовать следующий код:
// Создаём текстовый документ
Текст = Новый ТекстовыйДокумент;
// Формируем заголовки колонок
Текст.ДобавитьСтроку("Номенклатура;Количество;Цена");
// Добавляем данные из таблицы
Для Каждого Строка Из ЭлементыФормы.Товары Цикл
Текст.ДобавитьСтроку(Строка.Номенклатура + ";" + Строка.Количество + ";" + Строка.Цена);
КонецЦикла;
// Сохраняем в файл
Текст.Записать("C:\Export\Товары.csv", КодировкаТекста.UTF8);
Для работы с реквизитами формы используйте:
// Получаем значение реквизита "ДатаДокумента"
Дата = РеквизитФормы.ДатаДокумента;
// Получаем значение поля ввода "Контрагент"
Контрагент = ЭлементыФормы.Контрагент.Значение;
Всегда проверяйте права доступа перед выполнением программного кода. Если у пользователя нет прав на чтение реквизитов формы, скрипт завершится с ошибкой.
Если нужно экспортировать данные в Excel, используйте объект ExcelДокумент:
// Создаём Excel-документ
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Add();
Лист = Книга.Worksheets(1);
// Заполняем заголовки
Лист.Cells(1, 1).Value = "Номенклатура";
Лист.Cells(1, 2).Value = "Количество";
// Заполняем данные
СтрокаExcel = 2;
Для Каждого Строка Из ЭлементыФормы.Товары Цикл
Лист.Cells(СтрокаExcel, 1).Value = Строка.Номенклатура;
Лист.Cells(СтрокаExcel, 2).Value = Строка.Количество;
СтрокаExcel = СтрокаExcel + 1;
КонецЦикла;
// Сохраняем файл
Книга.SaveAs("C:\Export\Товары.xlsx");
Excel.Quit();
Обратите внимание, что для работы с Excel через COMОбъект на компьютере должен быть установлен Microsoft Excel или LibreOffice с поддержкой OLE.
5. Способ 4: Использование запросов к базе данных
Если данные общей формы связаны с таблицами базы данных (например, форма отображает данные из справочника или документа), их можно получить напрямую через запрос на языке 1С. Этот метод подходит для сложных отчётов или когда нужно обойти ограничения формы.
Пример запроса для получения данных из формы "Список номенклатуры":
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.Наименование КАК Наименование,
| ЦеныНоменклатуры.Цена КАК Цена
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
| ПО Номенклатура.Ссылка = ЦеныНоменклатуры.Номенклатура
|ГДЕ
| ЦеныНоменклатуры.ТипЦен = &ТипЦен";
Запрос.УстановитьПараметр("ТипЦен", Справочники.ТипыЦен.НайтиПоНаименованию("Розничная"));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование + " - " + Выборка.Цена);
КонецЦикла;
Чтобы связать запрос с данными формы, можно передавать параметры из реквизитов:
// Получаем дату из формы и передаём в запрос
ДатаНачала = ЭлементыФормы.ПериодНачала.Значение;
ДатаОкончания = ЭлементыФормы.ПериодОкончания.Значение;
Запрос.Текст =
"ВЫБРАТЬ
| Документ.РеализацияТоваровУслуг.Дата КАК Дата,
| Документ.РеализацияТоваровУслуг.Номер КАК Номер,
| Документ.РеализацияТоваровУслуг.СуммаДокумента КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Для выгрузки результата запроса в файл используйте:
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Дата;Номер;Сумма");
Пока Выборка.Следующий() Цикл
Текст.ДобавитьСтроку(Формат(Выборка.Дата, "ДЛФ=DT") + ";" +
Выборка.Номер + ";" +
Выборка.Сумма);
КонецЦикла;
Текст.Записать("C:\Export\Реализации.csv");
Для ускорения работы с большими выборками используйте Выборка.Выгрузить() вместо построчного чтения. Это уменьшает нагрузку на сервер 1С.
Если форма содержит данные из временных таблиц (например, результаты отчёта), их можно получить через объект РезультатЗапроса:
// Предполагаем, что в форме есть реквизит "ДанныеОтчета" типа "ТаблицаЗначений"
ТаблицаДанных = РеквизитФормы.ДанныеОтчета;
// Экспортируем в Excel
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Add();
Лист = Книга.Worksheets(1);
// Заполняем заголовки
Для Инд = 0 По ТаблицаДанных.Колонки.Количество() - 1 Цикл
Лист.Cells(1, Инд + 1).Value = ТаблицаДанных.Колонки[Инд].Заголовок;
КонецЦикла;
// Заполняем данные
Для ИндСтроки = 0 По ТаблицаДанных.Количество() - 1 Цикл
Для ИндКолонки = 0 По ТаблицаДанных.Колонки.Количество() - 1 Цикл
Лист.Cells(ИндСтроки + 2, ИндКолонки + 1).Value = ТаблицаДанных[ИндСтроки][ИндКолонки];
КонецЦикла;
КонецЦикла;
Книга.SaveAs("C:\Export\Отчет.xlsx");
Excel.Quit();
6. Способ 5: Внешние обработки и расширения
Если стандартные методы не подходят (например, форма не поддерживает экспорт или данные нужно преобразовать перед выгрузкой), можно использовать внешние обработки. Это универсальные инструменты, которые подключаются к 1С и расширяют её функционал.
Популярные обработки для работы с формами:
- 📄 "Универсальный экспорт в Excel" — выгружает данные из любых таблиц и форм.
- 📊 "Выгрузка данных в JSON/XML" — для интеграции с внешними системами.
- 🔄 "Обмен данными между формами" — копирует данные между разными формами.
- 🛠️ "Редактор форм" — позволяет модифицировать формы без изменения конфигурации.
Как подключить внешнюю обработку:
- Скачайте файл обработки (обычно имеет расширение
.epfили.erf). - В 1С откройте меню "Файл" → "Открыть".
- Выберите скачанный файл и нажмите "Открыть".
- В открывшемся окне обработки следуйте инструкциям (обычно нужно выбрать форму-источник и указать параметры выгрузки).
Пример использования обработки "Универсальный экспорт в Excel":
- Откройте общую форму с данными (например, "Список контрагентов").
- Запустите обработку "Универсальный экспорт в Excel".
- В окне обработки выберите:
- 📋 Источник данных: "Текущая форма"
- 📊 Таблица: "ОсновнаяТаблица" (или имя вашей табличной части)
- 📁 Путь сохранения: "C:\Export\Контрагенты.xlsx"
Преимущества внешних обработок:
- ✅ Не требуют изменения конфигурации (безопасно для типовых решений).
- ✅ Поддерживают сложные форматы выгрузки (например, JSON для API).
- ✅ Можно настроить шаблоны экспорта (например, только определённые колонки).
Недостатки:
- ⚠️ Не все обработки бесплатны (некоторые требуют лицензии).
- ⚠️ Может потребоваться настройка прав доступа.
- ⚠️ Некоторые обработки не обновляются под новые версии 1С.
Где скачать проверенные обработки?
Официальные и проверенные обработки можно найти:
1. На сайте ITS (Информационно-технологическое сопровождение) (для пользователей с ИТС).
2. В Infostart (раздел "Обработки").
3. На форуме 1С (в темах по администрированию).
Внимание: всегда проверяйте обработки на тестовой базе перед использованием в рабочей системе!Если вам нужно регулярно выгружать данные из формы, рассмотрите создание собственного расширения. Например, можно добавить кнопку "Экспорт в Excel" прямо в форму:
// Добавляем команду в форму
Команда = Команды.Добавить("ЭкспортВExcel");
Команда.Действие = "ЭкспортВExcelНажатие";
Команда.Заголовок = "Экспорт в Excel";
Команда.Изображение = БиблиотекаКартинок.Экспорт;
// Обработчик нажатия
Процедура ЭкспортВExcelНажатие(Команда)
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Add();
Лист = Книга.Worksheets(1);
// Экспортируем данные из таблицы "Товары"
Таблица = ЭлементыФормы.Товары;
Для ИндСтроки = 0 По Таблица.Строки.Количество() - 1 Цикл
Для ИндКолонки = 0 По Таблица.Колонки.Количество() - 1 Цикл
Лист.Cells(ИндСтроки + 1, ИндКолонки + 1).Value = Таблица.Строки[ИндСтроки].Ячейки[ИндКолонки].Значение;
КонецЦикла;
КонецЦикла;
Книга.SaveAs("C:\Export\Товары.xlsx");
Excel.Quit();
КонецПроцедуры
7. Типичные ошибки и как их избежать
При работе с общими формами пользователи и разработчики часто сталкиваются с одними и теми же проблемами. Вот TOP-5 ошибок и способы их решения:
1. Данные не сохраняются после закрытия формы
🔹 Причина: Пользователь забыл нажать "Сохранить" или "ОК", а данные в общей форме временные.
🔹 Решение: Всегда проверяйте, связаны ли данные формы с базой. Если форма используется для ввода, добавьте автосохранение через модуль:
Процедура ПриЗакрытии(Отказ)
Если Изменено Тогда
Вопрос = Вопрос("Данные были изменены. Сохранить?", РежимДиалогаВопрос.ДаНет);
Если Вопрос = КодВозвратаДиалога.Да Тогда
СохранитьДанные();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
2. При экспорте теряется форматирование
🔹 Причина: Excel или TXT не сохраняют типы данных (даты становятся текстом, числа — строками).
🔹 Решение: Используйте форматирование при выгрузке:
// Преобразуем дату в нужный формат
ДатаСтрокой = Формат(Дата, "ДФ=dd.MM.yyyy");
// Для чисел указываем разделитель дробной части
ЦенаСтрокой = Формат(Цена, "ЧДЦ=2; ЧРД=. ");
3. Запрос возвращает пустой результат
🔹 Причина: Неверно указаны параметры запроса или отсутствуют права на данные.
🔹 Решение: Проверьте:
- 🔸 Правильность имён таблиц и полей (регистр важен!).
- 🔸 Наличие данных в базе за указанный период.
- 🔸 Права пользователя (в
Администрирование → Пользователи).
4. Ошибка "Недостаточно памяти" при экспорте
🔹 Причина: Слишком большой объём данных (например, экспорт 100 000 строк в Excel).
🔹 Решение: Разбейте экспорт на части или используйте CSV вместо Excel:
// Экспорт по 1000 строк за раз
РазмерПачки = 1000;
ВсегоСтрок = Таблица.Строки.Количество();
ТекущаяСтрока = 0;
Пока ТекущаяСтрока < ВсегоСтрок Цикл
КонецПачки = Мин(ТекущаяСтрока + РазмерПачки, ВсегоСтрок);
ВыгрузитьПачку(Таблица, ТекущаяСтрока, КонецПачки, "C:\Export\Данные_часть" + Формат(ТекущаяСтрока/РазмерПачки + 1, "ЧГ=0") + ".csv");
ТекущаяСтрока = КонецПачки;
КонецЦикла;
5. Ошибка доступа к COM-объекту Excel
🔹 Причина: На компьютере не установлен Microsoft Excel или заблокированы OLE-соединения.
🔹 Решение: Используйте альтернативные методы:
- 🔸 Библиотеку
OneScript.Excel(не требует установленного Excel). - 🔸 Экспорт в CSV с последующим открытием в Excel.
- 🔸 Настройку прав DCOM в Windows (
dcomcnfg).
Перед массовым экспортом данных всегда делайте резервную копию базы 1С. Ошибки в коде могут привести к потере информации или блокировке сеансов других пользователей.
8. Автоматизация: как настроить регулярную выгрузку данных
Если данные из общей формы нужно выгружать регулярно (например, ежедневно или по расписанию), можно автоматизировать процесс с помощью:
- 📅 Регламентных заданий (встроенный механизм 1С).
- 🤖 Внешних скриптов (на Python, PowerShell).
- 🔄 Обменов данными (через REST API или COM-соединение).
Пример настройки регламентного задания:
- Откройте конфигуратор 1С.
- Перейдите в
Общие → Регламентные задания. - Создайте новое задание с типом "Выполнение кода".
- Укажите код для экспорта (аналогично примерам из раздела 4).
- Настройте расписание (например, ежедневно в 23:00).
- Сохраните и запустите задание.
Код для