Напиши отчет на 1С, который сравнивает таблицу mx...
Creato il: 24 ottobre 2025
Risposto usando GPT-5 Thinking da Chat01
Creato il: 24 ottobre 2025
Risposto usando GPT-5 Thinking da Chat01
Напиши отчет на 1С, который сравнивает таблицу mxl с данными справочника РегламентированныеОтчеты
Поиск идет по колонке "Наименование регламентной формы" в таблице mxl
и реквизиту "Наименование" справочника РегламентированныеОтчеты,
Вывести строки, в которых реквизит "УИДОтчета" справочника "РегламентированныеОтчеты" или не заполнен
или не совпадает с полем "ГУИД ссылки регламентной формы" в соответствующей строке таблицы mxl
ниже — готовый каркас внешнего отчёта 1С (упростил до одной формы). Он:
Сохраните как внешний отчёт и повесьте одну форму с реквизитами
ПутьКФайлу(Строка) иРезультат(ТабличныйДокумент), плюс две команды: ВыбратьФайл и Сформировать.
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); КонецФункции //----------------------------------------------------------- // Сервер: чтение справочника //----------------------------------------------------------- &НаСервере Функция ПолучитьКартуРегламентированныхОтчетов() Экспорт Карта = Новый Соответствие; Запрос = Новый Запрос( "ВЫБРАТЬ | РОтчеты.Ссылка КАК Ссылка, | РОтчеты.Наименование КАК Наименование, | РОтчеты.УИДОтчета КАК УИДОтчета |ИЗ | Справочник.РегламентированныеОтчеты КАК РОтчеты" ); Для Каждого Стр Из Запрос.Выполнить().Выгрузить() Цикл Карта.Вставить(Стр.Наименование, Новый Структура("Ссылка,УИДОтчета", Стр.Ссылка, Стр.УИДОтчета)); КонецЦикла; Возврат Карта; КонецФункции
ПутьКФайлу (строка) и Результат (ТабличныйДокумент).Если хотите исключить строки «Не найдено в справочнике», просто закомментируйте/удалите соответствующий вызов ДобавитьСтрокуВывода в блоке Иначе (где Карта.СодержитКлюч(Имя) = Ложь).