Напиши отчет на 1С, который сравнивает таблицу mx...

Criado em: 24 de outubro de 2025

Respondido usando GPT-5 Thinking por Chat01

Pergunta

Напиши отчет на 1С, который сравнивает таблицу mxl с данными справочника РегламентированныеОтчеты

Поиск идет по колонке "Наименование регламентной формы" в таблице mxl
и реквизиту "Наименование" справочника РегламентированныеОтчеты,
Вывести строки, в которых реквизит "УИДОтчета" справочника "РегламентированныеОтчеты" или не заполнен
или не совпадает с полем "ГУИД ссылки регламентной формы" в соответствующей строке таблицы mxl

Pensamento

Planning 1C report

The user asked for a report in 1C, likely for 1C:Enterprise, which involves comparing an MXL table with the "РегламентированныеОтчеты" catalog. The comparison will focus on the "Наименование регламентной формы" column and matching it with the "Наименование" attribute in the catalog.

I'll need to provide sample 1C code that loads the MXL file, processes the table, and compares it to the catalog.

Creating file selection and reading process

To create a report, I’ll use the 1C FileDialog to let the user select the MXL file. Once we have it, I can read the MXL using methods like "Новый ТабличныйДокумент" and "Прочитать(ПутьКФайлу)" to load the data.

I’ll then convert the MXL data into a "Таблицу" format or iterate through the table by columns, using "ТабличныйДокумент" methods for reading.

Mapping and comparing data

First, I need to find the columns for "Наименование регламентной формы" and "ГУИД ссылки регламентной формы" by scanning the header row. Then, for each data row, I’ll extract the name and GUID.

To compare this data with the catalog, I'll use a query to pull the catalog info, map it by "Наименование," and compare each MXL row. If the "УИДОтчета" is missing or doesn't match the MXL GUID, I’ll include those rows in the report.

Handling missing data

They didn't ask to output missing records explicitly, but I think it’s best to follow the instructions and only show mismatches as the spec suggests. If the record isn't found by name, I could note it with a "Не найден в справочнике" status, but I’ll prioritize accuracy by checking mismatches only.

For the code, I'll write a report module with a file selection command and include a procedure to generate the report, in line with typical 1C practices.

Creating the report code

The task is to help generate a 1C report with external processing, using the procedure "СформироватьОтчет". We'll create the basic code for reading the MXL file, extracting relevant columns, and comparing the data to catalog entries. A single module with a dialog to select the file, and functions to process data, will form the core of the solution. I'll provide compact code handling MXL reading, comparisons, and output as a tabular document for the report.

Thought for 1m 27s

Resposta

ниже — готовый каркас внешнего отчёта 1С (упростил до одной формы). Он:

  • открывает .mxl (табличный документ),
  • находит в нём колонки «Наименование регламентной формы» и «ГУИД ссылки регламентной формы»,
  • сверяет со справочником РегламентированныеОтчеты (по реквизиту Наименование),
  • выводит строки, где УИДОтчета не заполнен или не совпадает с GUID из .mxl.
    Если запись по наименованию в справочнике не найдена — помечаем это отдельным статусом (можете убрать, если не нужно).

Сохраните как внешний отчёт и повесьте одну форму с реквизитами ПутьКФайлу (Строка) и Результат (ТабличныйДокумент), плюс две команды: ВыбратьФайл и Сформировать.

1c
// Модуль формы внешнего отчёта #Использовать СтандартныеПодсистемы // не обязательно; можно убрать //----------------------------------------------------------- // UI //----------------------------------------------------------- &НаКлиенте Процедура ВыбратьФайл(Команда) Диалог = Новый ОткрытьФайлДиалог; Диалог.Заголовок = "Выберите MXL с таблицей регформ"; Диалог.Фильтр = "Табличный документ (*.mxl)|*.mxl"; Если Диалог.Выбрать() Тогда ПутьКФайлу = Диалог.ПолноеИмяФайла; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Сформировать(Команда) Если ПустаяСтрока(ПутьКФайлу) Тогда Сообщить("Укажите путь к .mxl"); Возврат; КонецЕсли; Попытка // читаем MXL на клиенте ТД = Новый ТабличныйДокумент; ТД.Прочитать(ПутьКФайлу); // ищем заголовки нужных колонок ОблИмя = ТД.Найти("Наименование регламентной формы"); ОблGUID = ТД.Найти("ГУИД ссылки регламентной формы"); Если ОблИмя = Неопределено Или ОблGUID = Неопределено Тогда Сообщить("В файле не найдены требуемые заголовки столбцов."); Возврат; КонецЕсли; СтрокаШапки = ОблИмя.ВерхняяГраница; КолонкаИмя = ОблИмя.ЛеваяГраница; КолонкаGUID = ОблGUID.ЛеваяГраница; // получаем карту справочника: Наименование -> {Ссылка, УИДОтчета} Карта = ПолучитьКартуРегламентированныхОтчетов(); // готовим результирующую таблицу Таб = Новый ТаблицаЗначений; Таб.Колонки.Добавить("Наименование"); Таб.Колонки.Добавить("УИД_Справочника"); Таб.Колонки.Добавить("GUID_ИзMXL"); Таб.Колонки.Добавить("Статус"); // проходим строки под шапкой; завершаем после серии пустых ПустыхПодряд = 0; МаксПустыхПодряд = 10; ТекСтрока = СтрокаШапки + 1; Пока ПустыхПодряд < МаксПустыхПодряд Цикл Имя = СокрЛП(ПолучитьТекстЯчейки(ТД, ТекСтрока, КолонкаИмя)); GUIDизMXL = СокрЛП(ПолучитьТекстЯчейки(ТД, ТекСтрока, КолонкаGUID)); Если ПустаяСтрока(Имя) И ПустаяСтрока(GUIDизMXL) Тогда ПустыхПодряд = ПустыхПодряд + 1; ТекСтрока = ТекСтрока + 1; Продолжить; Иначе ПустыхПодряд = 0; EndIf; Статус = ""; УИДСпр = ""; Если Карта.СодержитКлюч(Имя) Тогда СтруктураЭлемента = Карта.Получить(Имя); УИДСпр = Строка(СтруктураЭлемента.УИДОтчета); Если ПустаяСтрока(УИДСпр) Тогда Статус = "УИД в справочнике не заполнен"; ДобавитьСтрокуВывода(Таб, Имя, УИДСпр, GUIDизMXL, Статус); Иначе Если Не РавныGUID(УИДСпр, GUIDизMXL) Тогда Статус = "УИД не совпадает с GUID из MXL"; ДобавитьСтрокуВывода(Таб, Имя, УИДСпр, GUIDизMXL, Статус); КонецЕсли; КонецЕсли; Иначе // Если нужно выводить только несовпадения при наличии записи — закомментируйте следующую строку ДобавитьСтрокуВывода(Таб, Имя, "", GUIDизMXL, "Не найдено в справочнике"); КонецЕсли; ТекСтрока = ТекСтрока + 1; КонецЦикла; // выводим результат в табличный документ формы Результат = Новый ТабличныйДокумент; Результат.Вывести(Таб); Результат.АвтоМасштаб = Истина; ОповеститьОбИзменении("Результат"); Исключение Сообщить("Ошибка при обработке файла: " + ОписаниеОшибки()); КонецПопытки; КонецПроцедуры //----------------------------------------------------------- // Вспомогательные процедуры/функции (клиент) //----------------------------------------------------------- &НаКлиенте Процедура ДобавитьСтрокуВывода(Таблица, Имя, УИДСпр, GUIDизMXL, Статус) НСтр = Таблица.Добавить(); НСтр.Наименование = Имя; НСтр.УИД_Справочника = УИДСпр; НСтр.GUID_ИзMXL = GUIDизMXL; НСтр.Статус = Статус; КонецПроцедуры &НаКлиенте Функция ПолучитьТекстЯчейки(ТД, НомерСтроки, НомерКолонки) Экспорт Обл = ТД.ПолучитьОбласть(НомерКолонки, НомерСтроки, НомерКолонки, НомерСтроки); Возврат ТД.ПолучитьТекст(Обл); КонецФункции &НаКлиенте Функция НормализоватьGUID(Зн) Экспорт Стр = НРег(Строка(Зн)); Стр = СтрЗаменить(Стр, "{", ""); Стр = СтрЗаменить(Стр, "}", ""); Стр = СтрЗаменить(Стр, "-", ""); Стр = СокрЛП(Стр); Возврат Стр; КонецФункции &НаКлиенте Функция РавныGUID(G1, G2) Экспорт Возврат НормализоватьGUID(G1) = НормализоватьGUID(G2); КонецФункции //----------------------------------------------------------- // Сервер: чтение справочника //----------------------------------------------------------- &НаСервере Функция ПолучитьКартуРегламентированныхОтчетов() Экспорт Карта = Новый Соответствие; Запрос = Новый Запрос( "ВЫБРАТЬ | РОтчеты.Ссылка КАК Ссылка, | РОтчеты.Наименование КАК Наименование, | РОтчеты.УИДОтчета КАК УИДОтчета |ИЗ | Справочник.РегламентированныеОтчеты КАК РОтчеты" ); Для Каждого Стр Из Запрос.Выполнить().Выгрузить() Цикл Карта.Вставить(Стр.Наименование, Новый Структура("Ссылка,УИДОтчета", Стр.Ссылка, Стр.УИДОтчета)); КонецЦикла; Возврат Карта; КонецФункции

Как это использовать

  1. Создайте внешний отчёт и добавьте форму с реквизитами ПутьКФайлу (строка) и Результат (ТабличныйДокумент).
  2. Добавьте кнопки «ВыбратьФайл» и «Сформировать», привяжите их к одноимённым процедурам.
  3. В .mxl должны быть текстовые заголовки колонок точно как в условии.
  4. После «Сформировать» вы получите таблицу с колонками:
  • Наименование
  • УИД_Справочника
  • GUID_ИзMXL
  • Статус (пустой УИД, несовпадение, либо «Не найдено в справочнике»)

Если хотите исключить строки «Не найдено в справочнике», просто закомментируйте/удалите соответствующий вызов ДобавитьСтрокуВывода в блоке Иначе (где Карта.СодержитКлюч(Имя) = Ложь).

Compartilhar esta Q&A