Как показать сообщение пользователю? методы: СообщениеПользователю и ПоказатьОповещениеПользователя В 1С предполагается, что СообщениеПользователю выводятся для того, чтобы сообщить пользователю об ошибках.
А для информирования о выполняемом действии рекомендуется использовать метод встроенного языка ПоказатьОповещениеПользователя() .
СообщениеПользователю выводит сообщение пользователю (после окончания обработки) или сохраняет его в очередь, если сообщение невозможно вывести прямо сейчас.
Пример вывода сообщения на клиенте:
Код 1C v 8.3 Если ЗначениеЗаполнено(объект.ИнтернетМагазин) Тогда
// Все заполнено, обрабатываем
Иначе
сбп=Новый СообщениеПользователю;
сбп.Текст = "Укажите интернет-магазин данные которого Вы загружаете!";
сбп.Поле="ИнтернетМагазин";
сбп.ПутьКДанным = "Объект";
сбп.Сообщить();
КонецЕсли;
При обработке на сервере:
Необходимо зарегистрировать в системе соответствие объекта и имени реквизита формы. Для этого в глобальном контексте реализована функция УстановитьСоответствиеОбъектаИРеквизитаФормы(). Сделать это можно следующим образом:
Код 1C v 8.3 &НаСервере
Процедура ПроцедураВызываемаяСКлиента(ОбъектДанных)
Документ = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.ПоступлениеТМЦ")); // Преобразования данных формы в объект
УстановитьСоответствиеОбъектаИРеквизитаФормы(Документ, "Объект"); // Установка соответствия
ДействиеСОбъектом(Документ); // Действия над объектом, в процессе работы которых может возникнуть необходимость вывода сообщений
КонецПроцедуры
В данном фрагменте выполняется преобразование объекта из данных формы в реальный объект и устанавливается его соответствие с реквизитом формы по имени "Объект".
Если в дальнейшем требуется создать сообщение, можно сделать это следующим образом:
Код 1C v 8.3 &НаСервере
Процедура ДействиеСОбъектом(ОбъектДанных)
// Какие либо действия, которые требуют создания сообщения
// Создание сообщения
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "В строке 11 табличной части ""Номенклатура"" не хватает " +
НедостающееКоличество + " " + ЕдиницаИзмеренияНоменклатуры;
Сообщение.Поле = "Номенклатура[10].Количество";
// Привязка объекта к реквизиту формы произойдет за счет
// установленного выше по стеку соответствия методом
// УстановитьСоответствиеОбъектаИРеквизитаФормы
Сообщение.УстановитьДанные(ОбъектДанных);
// Теперь у сообщения заполнено поле ПутьКДанным (установлено имя реквизита формы, до этого была пустая строка),
// и свойство КлючДанных (установлена ссылка на документ, до этого было Неопределено)
// Сообщение выводится пользователю
Сообщение.Сообщить();
// в дальнейшем сообщение будет показано в форме и привязано к
// элементу управления связанного с полем Количество
// в 11-й строке табличной части Номенклатура.
КонецПроцедуры;
В этом фрагменте создается новый объект СообщениеПользователю, в котором запоминается Текст сообщения и указывается Поле объекта, ошибка в данных которого вызвала необходимость вывода сообщения. Информация о том, как объект расположен в форме берется из предварительно запомненной пары "Объект/ИмяРеквизитаФормы". В дальнейшем сообщение будет выведено в окно сообщений формы и привязано к соответствующему элементу управления.
Примеры заполнения свойства Поле объекта СообщениеПользователю ТипШаблонПример Реквизит ИмяРеквизита Контрагент Табличная часть ИмяТабличнойЧасти Скидки Реквизит табличной части ИмяТабличнойЧасти[ИндексСтроки].ИмяРеквизита Номенклатура[10].Количество Реквизит набора записей [ИндексСтроки].ИмяРеквизита [10].Курс
Еще примеры:
Код 1C v 8.3 &НаКлиенте
Процедура ДействиеСОбъектомНаКлиенте(ОбъектДанных)
// Какие либо действия, которые требуют создания сообщения
// Создание сообщения
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "В строке 11 табличной части ""Номенклатура"" не хватает " +
НедостающееКоличество + " " + ЕдиницаИзмеренияНоменклатуры;
Сообщение.Поле = "Номенклатура[10].Количество";
// Привязка объекта к реквизиту формы "вручную"
Сообщение.КлючДанных = ОбъектДанных.Ссылка;
Сообщение.ПутьКДанным = "Объект";
// Сообщение выводится пользователю
Сообщение.Сообщить();
КонецПроцедуры;
&НаСервере
Процедура Сообщить4НаСервере()
Сообщение4 = новый СообщениеПользователю;
Сообщение4.УстановитьДанные(РеквизитФормыВЗначение("Объект"));
Сообщение4.Текст = "4. Сообщение привязанное к реквизиту шапки Организация";
Сообщение4.Поле = "Организация";
Сообщение4.Сообщить();
КонецПроцедуры
// Показываем сообщение из обработки
// КлючДанных и ПутьКДанным - пустые
Сообщение = Новый СообщениеПользователю;
Сообщение.Поле = "Комментарий";
Сообщение.Текст = "Заполните комментарий";
Сообщение.Сообщить();
// Показываем сообщение из документа
// КлючДанных - пустой, ПутьКДанным заполнится автоматически
Сообщение = Новый СообщениеПользователю;
Сообщение.Поле = "Товары[0].Количество";
Сообщение.Текст = "Не заполнено количество товара в первой строке!";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
//////////////////// КОД для ТИПОВЫХ конфигураций, БСП:
//в модуле объекта
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(“Текст ошибки”,
ЭтотОбъект,
"Договор",,
Отказ);
//в форме объекта
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Дублирование пременной'"), ,
"Запросы["+ИдентификаторСтроки+"].ИмяПеременнойЗапроса",//путь к данным
"Объект", Отказ);
ПоказатьОповещениеПользователя - оповещение возникает в правом нижнем углу приложения и сообщает о совершенном действии. В течение нескольких секунд оно постепенно гаснет и пропадает. При этом, если навести на оповещение курсор мышки, оно не гаснет, и есть возможность внимательно его прочитать:
Код 1C v 8.3 ПоказатьОповещениеПользователя(НСтр("ru = 'Выполнение:'"), ПолучитьНавигационнуюСсылку(Объект), "Выгрузка завершена, все ОК!", БиблиотекаКартинок.ПолнотекстовыйПоискДалее);
Код 1C v 8.3 &НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ПолучитьДатуЗапретаРедактирования() >= Объект.Дата Тогда
НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Объект.Ссылка);
ПоказатьОповещениеПользователя("Только просмотр!",
НавигационнаяСсылка,
"Разрешен только просмотр документа!");
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДатуЗапретаРедактирования()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Константы.ДатаЗапретаРедактирования
|ИЗ
| Константы КАК Константы";
РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса.Выгрузить()[0].ДатаЗапретаРедактирования;
КонецФункции
Категория:
Работа с Формой (Диалог) и её элементами ДеревоЗначений в ТекстовыйДокумент Код 1C v 8.2 УП // Выводит данные ДереваЗначений в ТекстовыйДокумент, пригодный к рассмотрению в отладчике, окне сообщений и показу.
//
// Параметры:
// рВетка - дерево значений, подлежащее выводу. Может иметь почти любую глубину иерархии, количество и тип колонок. Если хватит
// объявленных позиционных строк-заполнителей, всё поместится. Если иерархия слишком глубока, строки просто надо нарастить;
// рТекст - на входе должен быть равен Неопределено; на выходе по окончании работы содержит результатный текстовый документ;
// рПараметры - структура дополнительных настроек, допустимые ключи:
// Колонки - структура колонок, которые подлежат выводу. Если пуста или имеет тип, отличный от структуры, выводятся все колонки;
// если в ключах структуры указаны имена колонок, будут выведены только они. В значениях структуры можно передать строковое
// представление формата, согласно которому должны будут форматироваться выводимые значения. По умолчанию формата нет;
// ПоказыватьУровни - булево, управляет выводом №№ уровней (метод Уровень()), по умолчанию выключено;
// ШагОтступа - число, определяющее шаг в символах, используемый для показа псевдографики иерархии веток в дереве.
//
&НаСервереБезКонтекста
Процедура ВывестиДеревоЗначенийВТекст(Знач рВетка,рТекст,Знач рПараметры=Неопределено)
Попытка
Если рТекст=Неопределено Тогда // первая итерация, шапочный вызов исходной части
//---------------------------------------------------------------------------------------------------------------------------
// Разбираем входные данные
Если ТипЗнч(рВетка)<>Тип("ДеревоЗначений") Тогда Возврат КонецЕсли;
Если ТипЗнч(рПараметры)<>Тип("Структура") Тогда рПараметры=Новый Структура КонецЕсли;
стрКолонок=?(рПараметры.Свойство("Колонки"),рПараметры.Колонки,Неопределено);
Если ТипЗнч(стрКолонок)<>Тип("Структура") Тогда стрКолонок=Новый Структура КонецЕсли;
рПоказыватьУровни=?(рПараметры.Свойство("ПоказыватьУровни"),рПараметры.ПоказыватьУровни,Ложь); // затратное дело, кстати
рШагОтступа=?(рПараметры.Свойство("ШагОтступа"),рПараметры.ШагОтступа,2); // для отображения отступа в колонке иерархии
//---------------------------------------------------------------------------------------------------------------------------
// Определяем максимальное количество уровней
// Также можно получить максимальный уровень, "плоско" перебрав все строки (например, получив их через НайтиСтроки)
// и в цикле для каждой вызывая Уровень() и определяя максимум.
// Вариант через СКД и служебное поле "Уровень" ни на одной известной мне платформе не работоспособен (нехватка памяти).
//
//
//рДеревоДляТеста=КакНибудьСкопироватьДерево(рВетка);
//рДеревоДляТеста.Колонки.Вставить(0,"_Level",Новый ОписаниеТипов("Булево")); // самый экономный вариант, с сохранением иерархии
//мНенужных=Новый Массив;
//Для й=1 По рДеревоДляТеста.Колонки.Количество()-1 Цикл
// мНенужных.Добавить(рДеревоДляТеста.Колонки[й]);
//КонецЦикла;
//Для каждого кол Из мНенужных Цикл
// рДеревоДляТеста.Колонки.Удалить(кол);
//КонецЦикла;
//
рДеревоДляТеста=рВетка; // пока сериализуем прямо всё дерево (неоптимально, но...)
рЗапись=Новый ЗаписьXML;
рЗапись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(рЗапись,рДеревоДляТеста);
стро=рЗапись.Закрыть();
//
стро=СтрЗаменить(стро,"xmlns=","xmlns:myns1C="); // иначе не будет работать XPath
//
рЧтение=Новый ЧтениеXML;
рЧтение.УстановитьСтроку(стро);
постр=Новый ПостроительDOM;
рДокументДОМ=постр.Прочитать(рЧтение);
рВыражение="/ValueTree/row"; максКолвоУровней=1;
рРазыменователь=Новый РазыменовательПространствИменDOM(рДокументДОМ);
Пока Истина Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
рРезультат=рДокументДОМ.ВычислитьВыражениеXPath(рВыражение,рДокументДОМ,рРазыменователь,ТипРезультатаDOMXPath.Любой);
Если рРезультат.ПолучитьСледующий()=Неопределено Тогда Прервать КонецЕсли;
рВыражение=рВыражение+"/row";
максКолвоУровней=максКолвоУровней+1;
КонецЦикла;
максКолвоУровней=максКолвоУровней-1; // можно и так: СтрЧислоВхождений(рВыражение,"/row")-1;
//---------------------------------------------------------------------------------------------------------------------------
// готовим исходный макет вывода
строПробелы=" ";
строРазделители="===============================================================================================";
строОтступы="___________________________________________________________________________________________"; // тут нужны чуть для другого
//
секШапка1="|[_HCS"+Лев(строПробелы,максКолвоУровней*рШагОтступа)+"]|"; // HierarchyColumnShow
секГорРазделитель1="|"+Лев(строОтступы,максКолвоУровней*рШагОтступа+6)+"|"; // здесь именно Отступы!
рШиринаКолонкиИерархии=СтрДлина(секШапка1)-2;
строПолейШапки="#Поле _HCS
| #Выравнивание Центр";
строПолейЗаписи="";
//
Если рПоказыватьУровни Тогда
секШапка1=секШапка1+"[_Level]|";
секГорРазделитель1=секГорРазделитель1+Лев(строРазделители,8)+"|";
строПолейШапки=строПолейШапки+"
|#Поле _Level
| #Выравнивание Центр";
строПолейЗаписи="#Поле _Level
| #Выравнивание Центр
| #Забивать Истина";
КонецЕсли;
//
мИменКолонок=Новый Массив;
Для каждого кол Из рВетка.Колонки Цикл
Если стрКолонок.Количество()<>0 и не стрКолонок.Свойство(кол.Имя) Тогда Продолжить КонецЕсли; // чётко указаны конкретные колонки
рДлинаИмениКолонки=СтрДлина(кол.Имя);
рНужнаяШирина=Макс(?(кол.Ширина<3,10,кол.Ширина),рДлинаИмениКолонки);
// к сожалению, ключевое слово "#Поля" неприменимо - платформа падает - поэтому делаем всё сами
секШапка1=секШапка1+"["+кол.Имя+Лев(строПробелы,рНужнаяШирина-рДлинаИмениКолонки)+"]|";
секГорРазделитель1=секГорРазделитель1+Лев(строРазделители,рНужнаяШирина+1)+"=|";
строПолейШапки=строПолейШапки+"
|#Поле "+кол.Имя+"
| #Выравнивание Центр";
рОписТипов=кол.ТипЗначения;
Если рОписТипов.Типы().Количество()=1 и рОписТипов.СодержитТип(Тип("Булево")) Тогда
рВыравнивание="Центр";
ИначеЕсли рОписТипов.СодержитТип(Тип("Число")) Тогда
рВыравнивание="Право";
ИначеЕсли рОписТипов.СодержитТип(Тип("Строка")) и рОписТипов.КвалификаторыСтроки.Длина=0 Тогда
рВыравнивание="ПоШирине";
Иначе
рВыравнивание="Лево";
КонецЕсли;
строПолейЗаписи=строПолейЗаписи+?(ПустаяСтрока(строПолейЗаписи),"",Символы.ПС)+"#Поле "+кол.Имя+"
| #Выравнивание "+рВыравнивание;
Попытка
Если ЗначениеЗаполнено(стрКолонок[кол.Имя]) Тогда // указан формат, уточняющий показ колонки
строПолейЗаписи=строПолейЗаписи+"
| #Формат """+СокрЛП(стрКолонок[кол.Имя])+"""";
КонецЕсли;
Исключение
КонецПопытки;
мИменКолонок.Добавить(кол.Имя);
КонецЦикла;
секШапка2=СтрЗаменить(СтрЗаменить(секШапка1,"[","<"),"]",">");
секЗапись1=секШапка1; секЗапись2=секШапка2; // пусть они по дизайну пока не отличаются
секГорРазделитель2=СтрЗаменить(СтрЗаменить(секГорРазделитель1,"=","-"),"|","+");
// обработаем нормальное обрамление шапки колонки иерархии
секГорРазделитель1=СтрЗаменить(секГорРазделитель1,"_","=");
секГорРазделитель2=СтрЗаменить(секГорРазделитель2,"_"," ");
//
тМакет=Новый ТекстовыйДокумент;
тМакет.ДобавитьСтроку("#Область Шапка");
тМакет.ДобавитьСтроку(строПолейШапки);
тМакет.ДобавитьСтроку(секГорРазделитель1);
тМакет.ДобавитьСтроку(секШапка1);
тМакет.ДобавитьСтроку(секШапка2);
тМакет.ДобавитьСтроку(секГорРазделитель1);
тМакет.ДобавитьСтроку("#КонецОбласти");
тМакет.ДобавитьСтроку("");
тМакет.ДобавитьСтроку("#Область Запись");
тМакет.ДобавитьСтроку(строПолейЗаписи);
тМакет.ДобавитьСтроку(секЗапись1);
тМакет.ДобавитьСтроку(секЗапись2);
тМакет.ДобавитьСтроку(секГорРазделитель2);
тМакет.ДобавитьСтроку("#КонецОбласти");
рПараметры.Вставить("ИсходныйМакет",тМакет); // пусть будет
//---------------------------------------------------------------------------------------------------------------------------
// Запускаем вывод в итоговый документ
рТекст=Новый ТекстовыйДокумент;
сек=тМакет.ПолучитьОбласть("Шапка");
сек.Параметры._HCS="Иерархия";
Для каждого имякол Из мИменКолонок Цикл
кол=рВетка.Колонки[имякол];
сек.Параметры[кол.Имя]=?(ПустаяСтрока(кол.Заголовок),кол.Имя,кол.Заголовок);
КонецЦикла;
рТекст.Вывести(сек);
//
пар=Новый Структура;
пар.Вставить("МассивИмёнКолонок",мИменКолонок);
пар.Вставить("ТекущаяСекция",тМакет.ПолучитьОбласть("Запись"));
пар.Вставить("ШиринаКолонкиИерархии",рШиринаКолонкиИерархии);
пар.Вставить("ПоказыватьУровни",рПоказыватьУровни);
пар.Вставить("Отступ",0);
пар.Вставить("ШагОтступа",рШагОтступа);
ВывестиДеревоЗначенийВТекст(рВетка,рТекст,пар);
Иначе
// очередная итерация, вывод в текстовый документ
мИменКолонок=рПараметры.МассивИмёнКолонок;
рСекция=рПараметры.ТекущаяСекция;
рОтступ=рПараметры.Отступ;
рШиринаКолонкиИерархии=рПараметры.ШиринаКолонкиИерархии;
рПоказыватьУровни=рПараметры.ПоказыватьУровни;
//
строОтступы="_________________________________________________________________________________________________________";
строПробелы=" ";
//
пар=Новый Структура;
пар.Вставить("МассивИмёнКолонок",мИменКолонок);
пар.Вставить("ТекущаяСекция",рПараметры.ТекущаяСекция);
пар.Вставить("ШиринаКолонкиИерархии",рШиринаКолонкиИерархии);
пар.Вставить("ПоказыватьУровни",рПоказыватьУровни);
пар.Вставить("ШагОтступа",рПараметры.ШагОтступа);
пар.Вставить("Отступ",рОтступ+рПараметры.ШагОтступа);
//
Для каждого рПодветка Из рВетка.Строки Цикл
рСекция.Параметры._HCS=Лев(строПробелы,рОтступ)+"\"+Лев(строОтступы,рШиринаКолонкиИерархии-рОтступ-1);
Если рПоказыватьУровни Тогда
рСекция.Параметры._Level=рПодветка.Уровень();
КонецЕсли;
Для каждого имякол Из мИменКолонок Цикл
рСекция.Параметры[имякол]=рПодветка[имякол];
КонецЦикла;
рТекст.Вывести(рСекция);
ВывестиДеревоЗначенийВТекст(рПодветка,рТекст,пар)
КонецЦикла;
//
КонецЕсли;
Исключение
Сообщить("ВывестиДеревоЗначенийВТекст, ошибка: "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
КонецПопытки;
КонецПроцедуры
Источник
Категория:
Работа с Деревом Значений Как в СКД повторять шапку на каждой странице при печати и вывести колонтитулы? Нужно выводить на каждой странице отчета, шапку. Отчет сделан через СКД (Схема компоновки данных). В схеме есть макет, в нем есть ячейки шапки .
Для этого используется метод - ПовторятьПриПечатиСтроки, о нем я уже писал: Как при печати выводить шапку на каждой странице (ПовторятьПриПечатиСтроки)?
Код кнопки формирования отчета:
Код 1C v 8.3 СводнаяКартаРезультат = Новый ТабличныйДокумент;
ПечатьСводнойКартыНаСервере(СводнаяКартаРезультат);
СводнаяКартаРезультат.Показать("СводнаяКарта");
Процедура вывода отчета:
Код 1C v 8.3 &НаСервере
Процедура ПечатьСводнойКартыНаСервере(СводнаяКартаРезультат)
СхемаКомпоновкиДанных = Справочники.Номенклатура.ПолучитьМакет("МакетСводнаяКарта");
СводнаяКартаРезультат.ПовторятьПриПечатиСтроки = СводнаяКартаРезультат.Область(7, , 7); // <- Строки вывода повторения нужно считать в уже результате вывода, а не в макете!
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
НомеклатураСсылка = Настройки.ПараметрыДанных.Элементы.Найти("НоменклатураСсылка");
НомеклатураСсылка.Значение = Объект.Ссылка;
НомеклатураСсылка.Использование = Истина;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки, ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(СводнаяКартаРезультат);
//ПроцессорВывода.ОтображатьПроцентВывода = Истина;
ПроцессорВывода.НачатьВывод();
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);
ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры
Если дополнительно нужно вывести колонтитулы,
тогда:
Код 1C v 8.3 // Верхний колонтитул
ТабДок.ВерхнийКолонтитул.Выводить = Истина;
ТабДок.ВерхнийКолонтитул.НачальнаяСтраница = 2;
ТабДок.ВерхнийКолонтитул.Шрифт = Новый Шрифт(Результат.ВерхнийКолонтитул.Шрифт, , , , Истина);
ТабДок.ВерхнийКолонтитул.ТекстСлева = "Заголовок отчета";
ТабДок.ВерхнийКолонтитул.ТекстВЦентре = "Стр. [&НомерСтраницы] из [&СтраницВсего]";
ТабДок.ВерхнийКолонтитул.ТекстСправа = "Дата/время печати: [&Дата]/[&Время]";
// Нижний колонтитул
ТабДок.НижнийКолонтитул.Выводить = Истина;
ТабДок.НижнийКолонтитул.Шрифт = Новый Шрифт(Результат.ВерхнийКолонтитул.Шрифт, , , , Истина);
ТабДок.НижнийКолонтитул.ТекстВЦентре = "Заголовок отчета";
Категория:
Схема Компоновки Данных Как при печати выводить шапку на каждой странице (ПовторятьПриПечатиСтроки)? Необходимо при печати, если происходит переход на следующую страницу таблицы, выводить шапку таблицы вверху на новой странице.
для печати шапки на каждой странице в языке программирования есть специальный метод - ПовторятьПриПечатиСтроки
Примеры его использования:
Код 1C v 8.х ТабДок.ПовторятьПриПечатиСтроки = ТабДок.Область(1, , 2, );
ЭлементыФормы.Поле_ТД.ПовторятьПриПечатиСтроки = Макет.Область("Шапка_Спецификации"); //или так
ЭлементыФормы.Поле_ТД.ПовторятьПриПечатиСтроки = Макет.Область("R777:R778");
Полный код вывода табличного документа с повторением шапки на каждой странице:
Код 1C v 8.х Функция ПечатьПриказаТ11а()
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПечатнаяФорма_МатериальнаяПомощь_Т11а";
ТабДокумент.ПовторятьПриПечатиСтроки = ТабДокумент.Область("R21:R22");
Макет = ПолучитьМакет("Т11а");
ОбластьМакетаШапкаДокумента = Макет.ПолучитьОбласть("Шапка");
ОбластьПовторятьПриПечати = Макет.ПолучитьОбласть("ПовторятьПриПечати");
ОбластьМакетаСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьМакетаПодвал = Макет.ПолучитьОбласть("Подвал");
ВыборкаДляШапкиДокумента = СформироватьЗапросДляШапкиДокумента().Выбрать();
ВыборкаРаботники = СформироватьЗапросДляТабличнойЧасти(1).Выбрать(); // ТЧ "Начисления"
Если ВыборкаРаботники.Количество() = 0 Тогда
ВыборкаРаботники = СформироватьЗапросДляТабличнойЧасти(2).Выбрать(); // ТЧ "Доп.Начисления"
КонецЕсли;
// Массив с двумя строками - для разбиения на страницы
ВыводимыеОбласти = Новый Массив();
ВыводимыеОбласти.Добавить(ОбластьМакетаСтрока);
// Вывод шапки документа
Пока ВыборкаДляШапкиДокумента.Следующий() Цикл
ОбластьМакетаШапкаДокумента.Параметры.Заполнить(ВыборкаДляШапкиДокумента);
ОбластьМакетаШапкаДокумента.Параметры.НазваниеОрганизации = СокрЛП(ОбластьМакетаШапкаДокумента.Параметры.НазваниеОрганизации);
КонецЦикла;
ТабДокумент.Вывести(ОбластьМакетаШапкаДокумента);
ном=0;
Пока ВыборкаРаботники.Следующий() Цикл
ОбластьМакетаСтрока.Параметры.Заполнить(ВыборкаРаботники);
ном=ном+1;
ОбластьМакетаСтрока.Параметры.ПодразделениеОрганизации = ВыборкаРаботники.ПодразделениеОрганизации.ПолноеНаименование();
ОбластьМакетаСтрока.Параметры.ном=ном;
ТабДокумент.Вывести(ОбластьМакетаСтрока);
КонецЦикла;
ОбластьМакетаПодвал.Параметры.Заполнить(ВыборкаДляШапкиДокумента); // Из запроса шапка документа.
ТабДокумент.Вывести(ОбластьМакетаПодвал);
Если ТабДокумент.ВысотаТаблицы > 0 Тогда
Возврат УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, 1, Ложь, ОбщегоНазначения.СформироватьЗаголовокДокумента(СсылкаНаОбъект,"Приказ о поощрении работника "));
КонецЕсли;
//Возврат ТабДокумент;
КонецФункции
Категория:
Табличный документ Пример создания внешней печатной формы для управляемого приложения Пример создания внешней печатной формы АКТа для Бухгалтерии 3.0
1. В конфигураторе 1C Предприятия 8 создаем внешнюю обработку (Файл->Новый->Внешняя обработка), задаем имя.
2. В модуле обработки пишем код. Постараюсь его максимально комментировать. Главное должно быть:
функция ПечатьВнешнейПечатнойФормы табличного документа - которая выведет данные в макет функция Печать - вызывается из конфигурации! в нее передается массив печатаемых объектов и функция СведенияОВнешнейОбработке(). Она необходима для регистрации печатной формы в справочнике ДополнительныеОтчетыИОбработки, в ней собирается структура с данными для подключения формы. Эта функция, а также ряд сопутствующих ей, практически одинаковы для всех печатных форм, поэтому их можно просто копировать в новую печатную форму ничего не меняя. Код 1C v 8.3 // Функция формирует табличный документ с Внешней печатной формой
//
// Возвращаемое значение:
// Табличный документ - печатная форма акта
Функция ПечатьВнешнейПечатнойФормы(МассивОбъектов, ОбъектыПечати, Подписант) Экспорт
ТабДок = новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
ОбластьДанные = Макет.ПолучитьОбласть("Данные");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
Запрос = новый запрос;
Запрос.УстановитьПараметр("МассивОбъектов",МассивОбъектов);
Запрос.Текст = "ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура,
| РеализацияТоваровУслугТовары.Сумма,
| РеализацияТоваровУслугТовары.Количество,
| РеализацияТоваровУслугТовары.Цена,
| РеализацияТоваровУслугТовары.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка В(&МассивОбъектов)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РеализацияТоваровУслугУслуги.Номенклатура,
| РеализацияТоваровУслугУслуги.Сумма,
| РеализацияТоваровУслугУслуги.Количество,
| РеализацияТоваровУслугУслуги.Цена,
| РеализацияТоваровУслугУслуги.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
|ГДЕ
| РеализацияТоваровУслугУслуги.Ссылка В(&МассивОбъектов)
|
|УПОРЯДОЧИТЬ ПО
| Ссылка";
ОбщаяВыборка = Запрос.Выполнить().Выгрузить();
Для Каждого СсылкаНаОбъект из МассивОбъектов Цикл
ОбластьШапки.Параметры.ТекстЗаголовка = "Акт № "+СсылкаНаОбъект.Номер;
ОбластьШапки.Параметры.Организация = СсылкаНаОбъект.Организация;
ТабДок.Вывести(ОбластьШапки);
Отбор = Новый Структура;
Отбор.Вставить("Ссылка",СсылкаНаОбъект);
Выборка = ОбщаяВыборка.НайтиСтроки(Отбор);
ИтогоСумма = 0;
ИтогоКоличество = 0;
Для Каждого Стр из Выборка Цикл
ЗаполнитьЗначенияСвойств(ОбластьДанные.Параметры,Стр);
ИтогоСумма = ИтогоСумма + Стр.Сумма;
ИтогоКоличество = ИтогоКоличество + Стр.Количество;
ТабДок.Вывести(ОбластьДанные);
КонецЦикла;
ОбластьПодвал.Параметры.ИтогоСумма = ИтогоСумма;
ОбластьПодвал.Параметры.Подписант = Подписант;
ТабДок.Вывести(ОбластьПодвал);
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЦикла;
Возврат ТабДок;
КонецФункции
// Экспортная процедура печати, вызываемая из основной программы
//
// Параметры:
// ВХОДЯЩИЕ:
// МассивОбъектовНазначения - Массив - список объектов ссылочного типа для печати документа
// Как правило, содержит один элемент с ссылкой на вызвавший форму объект (документ, справочник)
//
// ИСХОДЯЩИЕ:
// КоллекцияПечатныхФорм - ТаблицаЗначений - таблица сформированных табличных документов.
// Как правило, содержит одну строку с именем текущей печатной формы
// ОбъектыПечати - СписокЗначений - список объектов печати.
// ПараметрыВывода - Структура - Параметры сформированных табличных документов. Содержит поля:
// ДоступнаПечатьПоКомплектно - булево - по умолчанию Ложь
// ПолучательЭлектронногоПисьма
// ОтправительЭлектронногоПисьма
//
Процедура Печать(МассивОбъектовНазначения, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "АКТПечатьВнешняя") Тогда
ТабличныйДокумент = ПечатьВнешнейПечатнойФормы(МассивОбъектовНазначения, ОбъектыПечати, "");
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "АКТПечатьВнешняя", "АКТ (внешний)", ТабличныйДокумент);
ИначеЕсли УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "АКТПечатьВнешняяИван") Тогда
ТабличныйДокумент = ПечатьВнешнейПечатнойФормы(МассивОбъектовНазначения, ОбъектыПечати, "Иванов А.Ю.");
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "АКТПечатьВнешняяИван", "АКТ (внешний) Иванов", ТабличныйДокумент);
ИначеЕсли УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "АКТПечатьВнешняяПетр") Тогда
ТабличныйДокумент = ПечатьВнешнейПечатнойФормы(МассивОбъектовНазначения, ОбъектыПечати, "Петров В.С.");
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "АКТПечатьВнешняяПетр", "АКТ (внешний) Петров", ТабличныйДокумент);
КонецЕсли;
КонецПроцедуры
#Область СведенияОВнешнейОбработке
// Сервисная экспортная функция. Вызывается в основной программе при регистрации обработки в информационной базе
// Возвращает структуру с параметрами регистрации
//
// Возвращаемое значение:
// Структура с полями:
// Вид - строка, вид обработки, один из возможных: "ДополнительнаяОбработка", "ДополнительныйОтчет",
// "ЗаполнениеОбъекта", "Отчет", "ПечатнаяФорма", "СозданиеСвязанныхОбъектов"
// Назначение - Массив строк имен объектов метаданных в формате:
// <ИмяКлассаОбъектаМетаданного>.[ * | <ИмяОбъектаМетаданных>].
// Например, "Документ.СчетЗаказ" или "Справочник.*". Параметр имеет смысл только для назначаемых обработок, для глобальных может не задаваться.
// Наименование - строка - Наименование обработки, которым будет заполнено наименование элемента справочника по умолчанию.
// Информация - строка - Краткая информация или описание по обработке.
// Версия - строка - Версия обработки в формате “<старший номер>.<младший номер>” используется при загрузке обработок в информационную базу.
// БезопасныйРежим - булево - Принимает значение Истина или Ложь, в зависимости от того, требуется ли устанавливать или отключать безопасный режим
// исполнения обработок. Если истина, обработка будет запущена в безопасном режиме.
//
Функция СведенияОВнешнейОбработке() Экспорт
//Инициализируем структуру с параметрами регистрации
ПараметрыРегистрации = Новый Структура;
// Первый параметр, который мы должны указать - это какой вид обработки системе должна зарегистрировать.
// Допустимые типы: ДополнительнаяОбработка, ДополнительныйОтчет, ЗаполнениеОбъекта, Отчет, ПечатнаяФорма, СозданиеСвязанныхОбъектов
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть - ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов...
МассивНазначений = Новый Массив;
// Теперь нам необходимо передать в виде массива имен, к чему будет подключена наша ВПФ
// Имейте ввиду, что можно задать имя в таком виде: Документ.* - в этом случае обработка будет подключена ко всем документам в системе,
// которые поддерживают механизм ВПФ
МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг"); //Указываем документ к которому делаем внешнюю печ. форму
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "АКТ (Внешний)"); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок
ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ); // Зададим право обработке на использование безопасного режима. Более подробно можно узнать в справке к платформе (метод УстановитьБезопасныйРежим)
ПараметрыРегистрации.Вставить("Версия", "1.0"); // эти два параметра играют больше информационную роль,
ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма"); // т.е. это то, что будет видеть пользователь в информации к обработке
// Создадим таблицу команд (подробнее смотрим ниже)
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "Внешний: АКТ", "АКТПечатьВнешняя", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
ДобавитьКоманду(ТаблицаКоманд, "Внешний: АКТ (Иванов)", "АКТПечатьВнешняяИван", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
ДобавитьКоманду(ТаблицаКоманд, "Внешний: АКТ (Петров)", "АКТПечатьВнешняяПетр", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
#КонецОбласти
#Область Вспомогательное
// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ РЕГИСТРАЦИИ ОБРАБОТКИ
// Формирует структуру с параметрами регистрации регистрации обработки в информационной базе
//
// Параметры:
// ОбъектыНазначенияФормы - Массив - Массив строк имен объектов метаданных в формате:
// <ИмяКлассаОбъектаМетаданного>.[ * | <ИмяОбъектаМетаданных>].
// или строка с именем объекта метаданных
// НаименованиеОбработки - строка - Наименование обработки, которым будет заполнено наименование элемента справочника по умолчанию.
// Необязательно, по умолчанию синоним или представление объекта
// Информация - строка - Краткая информация или описание обработки.
// Необязательно, по умолчанию комментарий объекта
// Версия - строка - Версия обработки в формате “<старший номер>.<младший номер>” используется при загрузке обработок в информационную базу.
//
//
// Возвращаемое значение:
// Структура
//
Функция ПолучитьПараметрыРегистрации(ОбъектыНазначенияФормы = Неопределено, НаименованиеОбработки = "", Информация = "", Версия = "1.0")
Если ТипЗнч(ОбъектыНазначенияФормы) = Тип("Строка") Тогда
ОбъектНазначенияФормы = ОбъектыНазначенияФормы;
ОбъектыНазначенияФормы = Новый Массив;
ОбъектыНазначенияФормы.Добавить(ОбъектНазначенияФормы);
КонецЕсли;
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Назначение", ОбъектыНазначенияФормы);
Если Не ЗначениеЗаполнено(НаименованиеОбработки) Тогда
НаименованиеОбработки = ЭтотОбъект.Метаданные().Представление();
КонецЕсли;
ПараметрыРегистрации.Вставить("Наименование", НаименованиеОбработки);
Если Не ЗначениеЗаполнено(Информация) Тогда
Информация = ЭтотОбъект.Метаданные().Комментарий;
КонецЕсли;
ПараметрыРегистрации.Вставить("Информация", Информация);
ПараметрыРегистрации.Вставить("Версия", Версия);
Возврат ПараметрыРегистрации;
КонецФункции
// Формирует таблицу значений с командами печати
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
//Представление команды в пользовательском интерфейсе
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
//Уникальный идентификатор команды или имя макета печати
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
//Способ вызова команды: "ОткрытиеФормы", "ВызовКлиентскогоМетода", "ВызовСерверногоМетода"
// "ОткрытиеФормы" - применяется только для отчетов и дополнительных отчетов
// "ВызовКлиентскогоМетода" - вызов процедуры Печать(), определённой в модуле формы обработки
// "ВызовСерверногоМетода" - вызов процедуры Печать(), определённой в модуле объекта обработки
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
//Показывать оповещение.
//Если Истина, требуется показать оповещение при начале и при завершении работы обработки.
//Имеет смысл только при запуске обработки без открытия формы
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
//Дополнительный модификатор команды.
//Используется для дополнительных обработок печатных форм на основе табличных макетов.
//Для таких команд должен содержать строку ПечатьMXL
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
// Вспомогательная процедура.
//
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование = "ВызовСерверногоМетода", ПоказыватьОповещение = Ложь, Модификатор = "ПечатьMXL")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
#КонецОбласти
3. Добавляем макет вывода печатной формы:
4. Сохраняем и добавляем в конфигурацию:
Подключается через Администрирование - Печатные формы, отчеты и обработки:
Создаете новую обработку, записывайте и при открытии документа Реализация, нажав на Печать - появляются доступные печатные формы с разными подписывающими.
Скачать Шаблон внешней печатной формы для управляемого приложения
Категория:
Внешние печатные формы, отчеты и обработк… Функции ЕстьРеквизитДокумента и ЕстьРеквизитОбъекта При разработке частенько нужно проверить наличие реквизита в документе или справочнике.
Ниже приведены функции позволяющие проверить наличие заданных реквизитов в объектах конфигурации:
Код 1C v 8.х // Позволяет определить есть ли среди реквизитов шапки Объекта реквизит с переданным именем.
Функция ЕстьРеквизитОбъекта(ИмяРеквизита, Объект) Экспорт
МетаданныеОбъекта = Объект.Метаданные();
Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
Для документа:
Код 1C v 8.х // Позволяет определить есть ли среди реквизитов шапки документа
// реквизит с переданным именем.
//
// Параметры:
// ИмяРеквизита - строковое имя искомого реквизита,
// МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
//
// Возвращаемое значение:
// Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт
Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
P.S. Посмотрите еще Полезные функции по работе с метаданными
Категория:
Метаданные Ввод документа на основании - Программно Код 1C v 8.х НовДок = Документы.ПеречислениеНДФЛвБюджет.СоздатьДокумент();
//Заполнить - вызывает ОбработкаЗаполнения(Основание) в документе ПеречислениеНДФЛвБюджет
НовДок.Заполнить(ЭлементыФормы.ДокументСписок.ТекущаяСтрока);
НовДок.ПолучитьФорму().Открыть();
//Пример модуля документа ПеречислениеНДФЛвБюджет
Процедура ОбработкаЗаполнения(Основание)
Если ТипЗнч(Основание) = Тип("ДокументСсылка.ЗарплатаКВыплатеОрганизаций") Тогда
// Заполнение шапки
Комментарий = Основание.Комментарий;
КраткийСоставДокумента = Основание.КраткийСоставДокумента;
Организация = Основание.Организация;
Ответственный = Основание.Ответственный;
ДатаПлатежа = Основание.ПериодРегистрации;
МесяцНалоговогоПериода = Основание.ПериодРегистрации;
Для Каждого ТекСтрокаЗарплата Из Основание.Зарплата Цикл
НоваяСтрока = СотрудникиОрганизации.Добавить();
НоваяСтрока.Сумма = ТекСтрокаЗарплата.Сумма;
НоваяСтрока.ФизЛицо = ТекСтрокаЗарплата.Физлицо;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Категория:
Документы Загрузка данных из текстовых файлов, выбирая SQL запросом данные из этих файлов Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.
Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!
Рассмотрим вариант как это сделать! Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt
Где XXXXX – порядковой номер пары файлов
Структура строки в Head_XXXXX.txt
Код Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ
Структура строки в Rows_XXXXX.txt
Код Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.
В каждой паре файлов несколько Заказов. Необходимо загрузить эти заказы в БД 1С
Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл
schema.ini cо следующими строками:
Код [ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4
[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9
Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:
Ниже приведен пример кода для платформы 1С 8:
Код 1C v 8.х // Загружает данные из текстовых данных
//
// Параметры
// Стр_КаталогДанных - <Строка>
//
// Автор: Gmix 04.05.2006 12:22:09
//
// Возвращаемое значение:
// <Булево>
//
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
// проверки заполнения
ОБ_ФайлДанных=Новый Файл(Стр_КаталогДанных);
Если НЕ ОБ_ФайлДанных.ЭтоКаталог() Тогда
Сообщить("Необходимо указать каталог данных!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
Если НЕ ОБ_ФайлДанных.Существует() Тогда
Сообщить("Каталог """+Стр_КаталогДанных+""" не существует!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
ОБ_АДОКонект = Новый COMОбъект("ADODB.Connection");
ОБ_АДОРекордсетШапка = Новый COMОбъект("ADODB.Recordset");
ОБ_АДОРекордсетСтроки = Новый COMОбъект("ADODB.Recordset");
//Определяем пару файлов
Стр_ОкончаниеФайла="";
ФайлыШапок = НайтиФайлы(Стр_КаталогДанных, "Head_*.txt");
Для каждого ФайлШапки Из ФайлыШапок Цикл
Стр_ОкончаниеФайла=Сред(ФайлШапки.ИмяБезРасширения,6);
Стр_таблицаШапки=ФайлШапки.Имя;
Стр_ТаблицаСтрок="Rows_"+Стр_ОкончаниеФайла+".txt";
Стр_ИмяФайлСтрок=ДобавлениеСлеша(Стр_КаталогДанных)+Стр_ТаблицаСтрок;
ФайлСтрок=Новый Файл(Стр_ИмяФайлСтрок);
Если НЕ ФайлСтрок.Существует() Тогда
Сообщить("Не найден файл строк для файла шапки """+Стр_таблицаШапки+"""! Пара файлов не обработана",СтатусСообщения.Важное);
Продолжить;
КонецЕсли;
//Создаем схему данных
ФайлСхемыДанных=Новый Файл(ДобавлениеСлеша(Стр_КаталогДанных)+"schema.ini");
Если ФайлСхемыДанных.Существует() Тогда
Попытка
УдалитьФайлы(ФайлСхемыДанных.Путь,ФайлСхемыДанных.Имя);
Исключение
Сообщить("Не возможно удалить файл """+ФайлСхемыДанных.ПолноеИмя+""" для создания новой схемы данных! Проверте атрибуты файла",СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
КонецЕсли;
Стр_СхемаДанныхТхт="["+Стр_таблицаШапки+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=StoreNum Text Width 5
|Col3=DataNote DateTime Width 10
|Col4=DataDev DateTime Width 10
|Col5=DataDes DateTime Width 10
|Col6=CountLine Long Width 4
|["+Стр_ТаблицаСтрок+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=Articul Text Width 7
|Col3=Counts Double Width 9";
ТекстСхемы=Новый ЗаписьТекста(ФайлСхемыДанных.ПолноеИмя, КодировкаТекста.ANSI);
ТекстСхемы.Записать(Стр_СхемаДанныхТхт);
ТекстСхемы.Закрыть();
// Создаем коннект
Попытка
ОБ_АДОКонект.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Стр_КаталогДанных+";Extended Properties='text;FMT=Delimited;HDR=NO'");
Исключение
Сообщить("Невозможно открыть соединение!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Стр_SQL = "S_elect * FROM "+Стр_таблицаШапки;
Попытка
ОБ_АДОРекордсетШапка=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ ОБ_АДОРекордсетШапка.EOF Цикл
// Заказ
Стр_НомерЗаказа = ОБ_АДОРекордсетШапка.Fields("NumberNote").Value;
Стр_КодКА= ОБ_АДОРекордсетШапка.Fields("StoreNum").Value;
Д_ДатаЗаказа= ОБ_АДОРекордсетШапка.Fields("DataNote").Value;
Д_ДатаДоставки= ОБ_АДОРекордсетШапка.Fields("DataDev").Value;
Д_ДатаСбора= ОБ_АДОРекордсетШапка.Fields("DataDes").Value;
Ч_КоличествоСтрок = ОБ_АДОРекордсетШапка.Fields("CountLine").Value;
Сообщить("Заказ № "+Стр_НомерЗаказа+" от " +Д_ДатаЗаказа+ " Код контрагента: "+Стр_КодКА+" Дата доставки: "+Д_ДатаДоставки);
// Обработка строк заказа
Стр_SQL = "S_elect * FROM "+Стр_ТаблицаСтрок+" WHERE NumberNote='"+Стр_НомерЗаказа+"'";
Попытка
ОБ_АДОРекордсетСтроки=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Сч=0;
Сообщить(" № Артикул Количество");
Пока НЕ ОБ_АДОРекордсетСтроки.EOF Цикл
//Заполняем таб часть документа
Сч=Сч+1;
Стр_Артикул=СокрЛП(ОБ_АДОРекордсетСтроки.Fields("Articul").Value);
Ч_Количество=ОБ_АДОРекордсетСтроки.Fields("Counts").Value;
Сообщить(""+Сч+" " +Стр_Артикул+ " "+Ч_Количество);
ОБ_АДОРекордсетСтроки.MoveNext();
КонецЦикла;
ОБ_АДОРекордсетШапка.MoveNext();
КонецЦикла;
КонецЦикла;
Возврат Истина;
КонецФункции // ЗагрузитьДанныеИзtxt() Gmix 04.05.2006 12:22:21
Автор:
Журавлев Михаил Викторович Категория:
Конвертация данных, Обмен, Перенос Создание событий и напоминаний пользователям используя Задачи В процессе работы пользователей, зачастую возникает необходимость создать задачу другому пользователю ИБ и проконтролировать ее выполнение.
К примеру, существует следующая задача:
Автоматизируемая компания занимается торговлей оборудованием. Специфика отгрузки оборудования заключается в том, что в основном она сопровождается оказанием услуг по монтажу закупленного оборудования. Исходя из этого, при оформлении заказа покупателя необходимо кроме ответственного за данный заказ указывать ответственного сотрудника по монтажу (в случае если это услуга не предусмотрена, реквизит не виден).
Если услуга по монтажу оборудования предусмотрена, то автоматически должно сформироваться два напоминания (события):
- Для ответственного менеджера на дату и время напоминания
- Для сотрудника ответственного за монтаж за сутки до напоминания ответственному менеджеру.
Когда срабатывает напоминание у ответственного менеджера, он должен видеть отработано ли напоминание сотрудника по монтажу оборудования.
Сформировать отчет, показывающий состояние согласования (когда сотрудник, ответственный за монтаж отработал напоминание) по незакрытым заказам покупателей (в случае оказание услуги по монтажу).
Решим ее следующим способом:
Создаем три реквизита документа Заказ покупателя: М_Монтаж (булево), М_Монтажник (Справочник пользователи) и М_ДатаМонтажа. Размещаем их на форме. Для того что бы сами реквизиты и их надписи были не видимы добавим процедуру:
Код 1C v 8.х Процедура М_МонтажПриИзменении(Элемент)
ЭлементыФормы.М_Монтажник.Видимость = М_Монтаж;
ЭлементыФормы.М_ДатаМонтажа.Видимость = М_Монтаж;
ЭлементыФормы.НадписьМ_Монтажник.Видимость = М_Монтаж;
ЭлементыФормы.НадписьМ_ДатаМонтажа.Видимость = М_Монтаж;
КонецПроцедуры
При открытии формы документа тоже надо проверять можно ли отображать на форме новые реквизиты. Процедура УстановитьВидимость() вызывается из процедуры ПриОткрытии(). Именно здесь продублируем код процедуры М_МонтажПриИзменении(Элемент). Существуют, конечно, варианты. Например, можно управление видимостью организовать только в процедуре УстановитьВидимость() а в МонтажПриИзменении() обращаться к ней, или в процедуре УстановитьВидимость() вызывать МонтажПриИзменении(), однако, в первом варианте при каждом изменении значения реквизита «М_Монтаж» будет происходить установка видимости всех реквизитов в форме, что негативно скажется на производительности. Второй вариант не совсем корректен с точки зрения логики расположения программного кода, по этому сделаем наш код слегка избыточным, но зато логичным и не замедляющим работу программы.
При проведении документа следует создавать Задачу пользователя с взведенным флагом «Напоминание» и установленной датой напоминания. Лучше всего располагать создание задач после проверки на корректность заполнения всех полей документов (ведь документ может не провестись, а задачи создадутся)
Код 1C v 8.х // Движения по документу
Если Не Отказ Тогда
ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоУслугам, ТаблицаПоТаре, Отказ, Заголовок);
Если М_Монтаж тогда
РаботаСДиалогами.ПроверитьЗадачиПоОбъекту(Ссылка);
КонецЕсли;
КонецЕсли;
Создавать задачи лучше с помощью немного доработанной процедуры РаботаСДиалогами.ПроверитьЗадачиПоОбъекту(Ссылка);
Во-первых, она проверит, есть ли введенные на основании этого документа задачи, и если обнаружит их, выдаст диалоговое окно пользователю с предложением не создавать новые. Этим мы исключим вероятность создания большого числа напоминаний при перепроведении документа. В самой функции ПроверитьЗадачиПоОбъекту() напишем:
Код 1C v 8.х Процедура ПроверитьЗадачиПоОбъекту(ОбъектЗадачи) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| *
|ИЗ
| Задача.ЗадачиПользователя.ЗадачиПоИсполнителю(
| &ТекПользователь,
| Выполнена = ЛОЖЬ И Объект = &ОбъектЗадачи)
|";
Запрос.УстановитьПараметр("ТекПользователь", ПараметрыСеанса.ТекущийПользователь);
Запрос.УстановитьПараметр("ОбъектЗадачи" , ОбъектЗадачи);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выполнение = Вопрос("Обнаружены незавершенные задачи по заданному объекту!" + Символы.ПС + " Желаете просмотреть список этих задач вместо создания новой?", РежимДиалогаВопрос.ДаНет, 0);
Если Выполнение = КодВозвратаДиалога.Да Тогда
ОткрытьЗадачиТекущегоПользователя(ОбъектЗадачи);
Возврат;
КонецЕсли;
КонецЕсли;
// Сознание Задачи
НоваяЗадача = Задачи.ЗадачиПользователя.СоздатьЗадачу();
НоваяЗадача.Объект = ОбъектЗадачи;
НоваяЗадача.Оповещение = Истина;
Если ТипЗнч(ОбъектЗадачи) = Тип("ДокументСсылка.ЗаказПокупателя") тогда
Если ОбъектЗадачи.М_Монтаж тогда
НоваяЗадача.Наименование = "Напоминание менеджеру о сборке комплекта по: " + ОбъектЗадачи.Метаданные().Синоним;
НоваяЗадача.Дата = ТекущаяДата();
НоваяЗадача.СрокОповещения = ОбъектЗадачи.М_ДатаМонтажа;
НоваяЗадача.Инициатор = ОбъектЗадачи.Ответственный;
НоваяЗадача.Исполнитель = ОбъектЗадачи.Ответственный;
НоваяЗадача.Записать();
// Напоминание мастеру
НоваяЗадача = Задачи.ЗадачиПользователя.СоздатьЗадачу();
НоваяЗадача.Дата = ТекущаяДата();
НоваяЗадача.Объект = ОбъектЗадачи;
НоваяЗадача.Инициатор = ОбъектЗадачи.Ответственный;
НоваяЗадача.Оповещение = Истина;
НоваяЗадача.Исполнитель = ОбъектЗадачи.М_Монтажник;
НоваяЗадача.Наименование = "Напоминание мастеру о сборке комплекта по: " + ОбъектЗадачи.Метаданные().Синоним;
НоваяЗадача.СрокОповещения = ОбъектЗадачи.М_ДатаМонтажа - 24 * 60 * 60;
НоваяЗадача.Записать();
КонецЕСли;
Иначе
НоваяЗадача.Наименование = "Напоминание по объекту: " + ОбъектЗадачи.Метаданные().Синоним;
ФормаНовой = НоваяЗадача.ПолучитьФорму();
ФормаНовой.Открыть();
КонецЕсли;
КонецПроцедуры
Обратите внимание на реквизит «Инициатор» двух создаваемых нами задач. В форме списка задач существует возможность переключаться в режим просмотра заданий выданных текущим пользователем. Именно с помощью такого определения инициатора выполняется условие задачи: «В окошке напоминания менеджера должно быть видно, отработано ли событие монтажником»
Отчет в задании совсем не сложный, правда, могут возникнуть сомнения какой заказ считать закрытым. Как известно, заказ покупателя делает два движения. Одно по регистру «Заказы покупателя» где в разрезе номенклатуры, ведется учет по отгруженным товарам, второе по регистру «Расчеты с контрагентами» и здесь контролируется оплата по заказу. Думаю, что закрытым можно считать заказ, которого нет в остатках ни по одному, ни по второму регистру. Соединив их полным соединением, а так же присоединив таблицу Задач пользователя, получим отчет по незакрытым заказам пользователя.
Автор: Максим Нечистяк Категория:
Задачи Загрузка данных из текстовых файлов с выборкой через ADO. Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.
Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!
Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt
Где XXXXX – порядковой номер пары файлов
Структура строки в Head_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ
Структура строки в Rows_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.
В каждой паре файлов несколько Заказов.
Необходимо загрузить эти заказы в БД 1С
Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл schema.ini cо следующими строками:
Код [ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4
[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9
Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:
Ниже приведен пример кода для платформы 1С 8:
Код 1C v 8.х // Загружает данные из текстовых данных
// Параметры
// Стр_КаталогДанных - <Строка>
// Автор: Gmix 04.05.2006 12:22:09
// Возвращаемое значение:
// <Булево>
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
// проверки заполнения
ОБ_ФайлДанных=Новый Файл(Стр_КаталогДанных);
Если НЕ ОБ_ФайлДанных.ЭтоКаталог() Тогда
Сообщить("Необходимо указать каталог данных!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
Если НЕ ОБ_ФайлДанных.Существует() Тогда
Сообщить("Каталог """+Стр_КаталогДанных+""" не существует!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
ОБ_АДОКонект = Новый COMОбъект("ADODB.Connection");
ОБ_АДОРекордсетШапка = Новый COMОбъект("ADODB.Recordset");
ОБ_АДОРекордсетСтроки = Новый COMОбъект("ADODB.Recordset");
//Определяем пару файлов
Стр_ОкончаниеФайла="";
ФайлыШапок = НайтиФайлы(Стр_КаталогДанных, "Head_*.txt");
Для каждого ФайлШапки Из ФайлыШапок Цикл
Стр_ОкончаниеФайла=Сред(ФайлШапки.ИмяБезРасширения,6);
Стр_таблицаШапки=ФайлШапки.Имя;
Стр_ТаблицаСтрок="Rows_"+Стр_ОкончаниеФайла+".txt";
Стр_ИмяФайлСтрок=ДобавлениеСлеша(Стр_КаталогДанных)+Стр_ТаблицаСтрок;
ФайлСтрок=Новый Файл(Стр_ИмяФайлСтрок);
Если НЕ ФайлСтрок.Существует() Тогда
Сообщить("Не найден файл строк для файла шапки """+Стр_таблицаШапки+"""! Пара файлов не обработана",СтатусСообщения.Важное);
Продолжить;
КонецЕсли;
//Создаем схему данных
ФайлСхемыДанных=Новый Файл(ДобавлениеСлеша(Стр_КаталогДанных)+"schema.ini");
Если ФайлСхемыДанных.Существует() Тогда
Попытка
УдалитьФайлы(ФайлСхемыДанных.Путь,ФайлСхемыДанных.Имя);
Исключение
Сообщить("Не возможно удалить файл """+ФайлСхемыДанных.ПолноеИмя+""" для создания новой схемы данных! Проверте атрибуты файла",СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
КонецЕсли;
Стр_СхемаДанныхТхт="["+Стр_таблицаШапки+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=StoreNum Text Width 5
|Col3=DataNote DateTime Width 10
|Col4=DataDev DateTime Width 10
|Col5=DataDes DateTime Width 10
|Col6=CountLine Long Width 4
|["+Стр_ТаблицаСтрок+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=Articul Text Width 7
|Col3=Counts Double Width 9";
ТекстСхемы=Новый ЗаписьТекста(ФайлСхемыДанных.ПолноеИмя, КодировкаТекста.ANSI);
ТекстСхемы.Записать(Стр_СхемаДанныхТхт);
ТекстСхемы.Закрыть();
// Создаем коннект
Попытка
ОБ_АДОКонект.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Стр_КаталогДанных+";Extended Properties='text;FMT=Delimited;HDR=NO'");
Исключение
Сообщить("Невозможно открыть соединение!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Стр_SQL = "S_elect * FROM "+Стр_таблицаШапки;
Попытка
ОБ_АДОРекордсетШапка=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ ОБ_АДОРекордсетШапка.EOF Цикл
// Заказ
Стр_НомерЗаказа = ОБ_АДОРекордсетШапка.Fields("NumberNote").Value;
Стр_КодКА= ОБ_АДОРекордсетШапка.Fields("StoreNum").Value;
Д_ДатаЗаказа= ОБ_АДОРекордсетШапка.Fields("DataNote").Value;
Д_ДатаДоставки= ОБ_АДОРекордсетШапка.Fields("DataDev").Value;
Д_ДатаСбора= ОБ_АДОРекордсетШапка.Fields("DataDes").Value;
Ч_КоличествоСтрок = ОБ_АДОРекордсетШапка.Fields("CountLine").Value;
Сообщить("Заказ № "+Стр_НомерЗаказа+" от " +Д_ДатаЗаказа+ " Код контрагента: "+Стр_КодКА+" Дата доставки: "+Д_ДатаДоставки);
// Обработка строк заказа
Стр_SQL = "S_elect * FROM "+Стр_ТаблицаСтрок+" WHERE NumberNote='"+Стр_НомерЗаказа+"'";
Попытка
ОБ_АДОРекордсетСтроки=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Сч=0;
Сообщить(" № Артикул Количество");
Пока НЕ ОБ_АДОРекордсетСтроки.EOF Цикл
//Заполняем таб часть документа
Сч=Сч+1;
Стр_Артикул=СокрЛП(ОБ_АДОРекордсетСтроки.Fields("Articul").Value);
Ч_Количество=ОБ_АДОРекордсетСтроки.Fields("Counts").Value;
Сообщить(""+Сч+" " +Стр_Артикул+ " "+Ч_Количество);
ОБ_АДОРекордсетСтроки.MoveNext();
КонецЦикла;
ОБ_АДОРекордсетШапка.MoveNext();
КонецЦикла;
КонецЦикла;
Возврат Истина;
КонецФункции
Автор
Журавлев Михаил Викторович Категория:
JSON, XML, TXT, CSV, DBF Печать табличной части документа в Word'e Вот пример кода создания и заполнения таблиц(пример для 7.7, в 8.х заменить первую строку на МСВорд Новый COMОбъект("Word.Application")):
Код 1C v 7.x МСВорд = СоздатьОбъект("Word.Application");
Документ = МСВорд.Documents;
Документ.Add();
Документ = МСВорд.ActiveDocument();
Документ.Paragraphs.Add();
Диапазон = Документ.Paragraphs(Документ.Paragraphs.Count()).Range;
//Добавим таблицу фиксированного размера 3х2
Документ.Tables.Add(Диапазон,3,2);
Документ.Tables(1).Range.S_elect();
Выбор = МСВорд.S_election();
Выбор.Style = "Сетка таблицы";
//Установим ширину обоих колонок по 8 см
Документ.Tables(1).Columns(1).Width= МСВорд.CentimetersToPoints(8);
Документ.Tables(1).Columns(2).Width= МСВорд.CentimetersToPoints(8);
//Заполнение
Документ.Tables(1).Cell(1,1).Range.Text = "Это первая сирока, первая колонка";
Документ.Tables(1).Cell(2,1).Range.Text = "";
Документ.Tables(1).Cell(3,1).Range.Text = "";
Документ.Tables(1).Cell(1,2).Range.Text = "";
Документ.Tables(1).Cell(2,2).Range.Text = "";
Документ.Tables(1).Cell(3,2).Range.Text = "Это третья строка, вторая колонка";
//Добавим таблицу с произвольным количеством строк, для примера возьмем 4 колонки
//Сначала выведем заголовок таблицы
Документ.Paragraphs.Add();
Диапазон = Документ.Paragraphs(Документ.Paragraphs.Count()).Range;
Документ.Tables.Add(Диапазон,1,4);
Документ.Tables(2).Range.S_elect();
Выбор = МСВорд.S_election();
Выбор.Style = "Сетка таблицы";
Выбор.Rows.AllowBreakAcrossPages = 0;
//Зададим ширину колонок
Документ.Tables(2).Columns(1).Width= МСВорд.CentimetersToPoints(2);
Документ.Tables(2).Columns(2).Width= МСВорд.CentimetersToPoints(4);
Документ.Tables(2).Columns(3).Width= МСВорд.CentimetersToPoints(4);
Документ.Tables(2).Columns(4).Width= МСВорд.CentimetersToPoints(10);
//Заполнение шапки таблицы
Документ.Tables(2).Cell(1,1).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,1).Range.Text = "№";
Документ.Tables(2).Cell(1,2).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,2).Range.Text = "Колонка 2";
Документ.Tables(2).Cell(1,3).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,3).Range.Text = "Колонка 3";
Документ.Tables(2).Cell(1,4).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,4).Range.Text = "Примечание";
//Для документа можно так цикл организовать:
//Предположим, что Док - это документ, тогда
Для А =1 По Док.КоличествоСтрок() Цикл
Док.ПолучитьСтрокуПоНомеру(А);
Выбор.I_nsertRowsBelow(1);
Документ.Tables(2).Cell(А+1,1).Range.Text = Строка(А);//номер строки
Документ.Tables(2).Cell(А+1,2).Range.Text = Док.РеквизитТабличнойЧастиДокумента1;
Документ.Tables(2).Cell(А+1,3).Range.Text = Док.РеквизитТабличнойЧастиДокумента2;
Документ.Tables(2).Cell(А+1,4).Range.Text = Док.РеквизитТабличнойЧастиДокумента3;
КонецЦикла;
//или выведем таблицу по таблице значений
Для А = 1 По ТЗ.КоличествоСтрок() Цикл
//Добавим строку в таблицу
Выбор.I_nsertRowsBelow(1);
Документ.Tables(2).Cell(А+1,1).Range.Text = Строка(А);//номер строки
Документ.Tables(2).Cell(А+1,2).Range.Text = ТЗ.ПолучитьЗначение(А,1);
Документ.Tables(2).Cell(А+1,3).Range.Text = ТЗ.ПолучитьЗначение(А,2);
Документ.Tables(2).Cell(А+1,4).Range.Text = ТЗ.ПолучитьЗначение(А,3);
КонецЦикла;
//Запишем Документ
Документ.SaveAs("ПутьИИмяДокумента",0);
Документ.Close();
ТЗ - это таблица значений.
Для документа можно так цикл организовать:
Предположим, что Док - это документ, тогда
Код 1C v 8.2 УП Для А =1 По Док.КоличествоСтрок() Цикл
Док.ПолучитьСтрокуПоНомеру(А);
Выбор.I_nsertRowsBelow(1);
Документ.Tables(2).Cell(А+1,1).Range.Text = Строка(А);//номер строки
Документ.Tables(2).Cell(А+1,2).Range.Text = Док.РеквизитТабличнойЧастиДокумента1;
Документ.Tables(2).Cell(А+1,3).Range.Text = Док.РеквизитТабличнойЧастиДокумента2;
Документ.Tables(2).Cell(А+1,4).Range.Text = Док.РеквизитТабличнойЧастиДокумента3;
КонецЦикла;
Категория:
Работа с Microsoft Office и OpenOffice Реквизит ~ Проверка на заполненность реквизитов формы, с признаком АвтоОтметкаНезаполненного Код 1C v 8.х //Проверка на заполненность реквизитов формы, для которых установлен признак АвтоОтметкаНезаполненного
Функция ПроверкаАвтоОтметкаНезаполненного(ЭлементыФормы) Экспорт
Результат = Ложь;
Для каждого Элемент Из ЭлементыФормы Цикл
Если ТипЗнч(Элемент) = Тип("ПолеВвода") Тогда
Если Элемент.АвтоОтметкаНезаполненного И ЗначениеНеЗаполнено(Элемент.Значение) Тогда
Сообщить("Необходимо заполнить обязательное поле ввода: " + Элемент.Подсказка, СтатусСообщения.Внимание);
Результат = Истина;
КонецЕсли;
ИначеЕсли ТипЗнч(Элемент) = Тип("ТабличноеПоле") Тогда
СоставПоля = Элемент.Значение;
Колонки = Элемент.Колонки;
Попытка // для ДокументСписок вызовет исключение
Для каждого Строка Из СоставПоля Цикл
Для каждого Колонка Из Колонки Цикл
Если ТипЗнч(Колонка.ЭлементУправления) = Тип("ПолеВвода") Тогда
Если Колонка.АвтоОтметкаНезаполненного И ЗначениеНеЗаполнено(Строка[Колонка.Данные]) Тогда
Сообщить("Необходимо заполнить обязательное поле ввода табличной части: " + Колонка.ТекстШапки, СтатусСообщения.Внимание);
Результат = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Исключение
КонецПопытки;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Категория:
Работа с Формой (Диалог) и её элементами Реквизит ~ Функция проверяет заполненность реквизитов объекта Как вызвать стандартную проверку заполнения реквизитов?
Код 1C v 8.2 УП ПроверитьЗаполнение()
Возвращаемое значение:
Тип: Булево. Истина - ошибок не обнаружено, Ложь - в противном случае.
Описание:
Проверяет заполнение реквизитов. Для реквизитов, у которых свойство "Проверка заполнения" установлено в значение "Показывать ошибку" и реквизит не заполнен, будет сформировано сообщение об ошибке.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент.
Код 1C v 8.2 УП &НаКлиенте
Процедура СформироватьБезСКД(Команда)
// Проверим заполнение обязательных реквизитов
Если Не ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
СформироватьСервер();
КонецПроцедуры
Обработчик проверки заполнения
У прикладных объектов на платформе 1С Предприятие 8.2 появился новый обработчик события ОбработкаПроверкиЗаполнения, где теперь рекомендуется делать все проверки на заполненность реквизитов объекта. Рассмотрим работу с этим обработчиком. Обработчик должен быть расположен в модуле объекта (для констант в модуле менеджера значений) и имеет следующий синтаксис:
Код 1C v 8.2 УП Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
КонецПроцедуры
Здесь параметр Отказ (тип Булево) отвечает за возможность дальнейшей работы программы после проверки заполнения, а в параметре ПроверяемыеРеквизиты(тип Массив) содержатся реквизиты объекта, которые система будет проверять на заполненность. Напомним, что в версии 1С Предприятие 8.2 появилось возможность на уровне свойств реквизитов объекта устанавливать свойство Проверка заполнения. Так вот в массив ПроверяемыеРеквизиты по умолчанию система помещает реквизиты с установленным свойством «Выдавать ошибку». Однако разработчик может сам некоторые реквизиты добавить в массив или удалить из него в зависимости от каких-либо условий:
Код 1C v 8.2 УП Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Клиент = ПроверяемыеРеквизиты.Найти("Контрагент");
Если Клиент<>Неопределено тогда
ПроверяемыеРеквизиты.Удалить(Клиент);
конецесли;
ПроверяемыеРеквизиты.Добавить("Склад");
КонецПроцедуры
Как видно из примера в качестве элементов массива выступают строковые наименование реквизитов, как они заданы в конфигураторе. Для того чтобы полностью отказаться от системной проверки, необходимо очистить массив. При этом разработчик может проводить проверку реквизитов по произвольным алгоритмам, система же проверяет только на заполненность/незаполненность:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Код 1C v 8.2 УП ПроверяемыеРеквизиты.Очистить();
Если Контрагент.ПометкаУдаления Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Нельзя указывать контрагента, помеченного на удаление!";
Сообщение.Поле = "Контрагент";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедур
Далее рассмотрим, когда вызывается данный обработчик. Это зависит от типа объекта и его свойств. Так для, например, для справочника обработчик вызывается перед записью объекта; для документа: если разрешено проведение - при проведении, иначе при записи; для обработки : при вызове стандартных команд "OK", Да". Подробно это описано во встроенной справке. Но также есть возможность вызвать данный обработчик в произвольный момент, используя метод объекта ПроверитьЗаполнение(). Например, определить команду Проверить в форме документа:
Код 1C v 8.2 УП &НаКлиенте
Процедура Проверить(Команда)
ПроверитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПроверитьНаСервере()
Документ = РеквизитФормыВЗначение("Объект");
Документ.ПроверитьЗаполнение();
КонецПроцедуры
Автор:
Борис Захаров
Код 1C v 8.х //СписокРеквизитов - список значений. Элемент списка значений - имена реквизитов для проверки через запятую.
//Если представление заполнено - считается, что передаются реквизиты табличной части. Пример:
СписокРеквизитовДляПроверки=Новый СписокЗначений;
СписокРеквизитовДляПроверки.Добавить("Контрагент,МестоХранения,ВидОперации");
СписокРеквизитовДляПроверки.Добавить("Номенклатура,Единица,Цена,Количество","ПолнаяТаблица");
СписокРеквизитовДляПроверки.Добавить("ВидОтклонений,Номенклатура,Единица,Серия,Цена,Количество","ТаблицаОтклонений");
Если Не глРеквизитыОбъектаЗаполнены(Источник,СписокРеквизитовДляПроверки) Тогда
Отказ=Истина;
Возврат;
КонецЕсли;
Функция глРеквизитыОбъектаЗаполнены(Объект,СписокРеквизитов) Экспорт
МетаданныеОбъекта=Объект.Метаданные();
МетаданныеТабличныеЧасти=МетаданныеОбъекта.ТабличныеЧасти;
РеквизитыЗаполнены=Истина;
СтрокаДляВыполнения="";
Для каждого НаборРеквизитов Из СписокРеквизитов Цикл
НаименованиеТаблицы=НаборРеквизитов.Представление;
РеквизитыДляПроверки=СтрЗаменить(НаборРеквизитов.Значение,",",Символы.ПС);
ДлинаСпискаРеквизитов=СтрЧислоСтрок(РеквизитыДляПроверки);
Если НаименованиеТаблицы<>"" Тогда
МетаданныеТаблица=МетаданныеТабличныеЧасти[НаименованиеТаблицы];
МетаданныеРевизитыТаблицы=МетаданныеТаблица.Реквизиты;
ТаблицаОбъекта=Объект[НаименованиеТаблицы];
Для СчетчикСтрокРевизитов=1 По ДлинаСпискаРеквизитов Цикл
ИдентРеквизита=СтрПолучитьСтроку(РеквизитыДляПроверки,СчетчикСтрокРевизитов);
МетаданныеРеквизит=МетаданныеРевизитыТаблицы[ИдентРеквизита];
ОписаниеТиповРеквизита=МетаданныеРеквизит.Тип;
ТипыЗначенийРеквизита=ОписаниеТиповРеквизита.Типы();
СтрокаПоиска=ТаблицаОбъекта.Найти(глПолучитьПустоеЗначениеТипа(ТипыЗначенийРеквизита[0]),ИдентРеквизита);
Если СтрокаПоиска=Неопределено Тогда
Продолжить;
КонецЕсли;
Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+МетаданныеРеквизит.Синоним+""" Табличная часть строка "+СтрокаПоиска.НомерСтроки);
КонецЦикла;
Иначе
Для СчетчикСтрокРевизитов=1 По ДлинаСпискаРеквизитов Цикл
ИдентРеквизита=СтрПолучитьСтроку(РеквизитыДляПроверки,СчетчикСтрокРевизитов);
Если Не ЗначениеЗаполнено(Объект[ИдентРеквизита]) Тогда
МетаданныеРевизитыШапки=МетаданныеОбъекта.Реквизиты;
Попытка
Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+МетаданныеРевизитыШапки[ИдентРеквизита].Синоним+"""");
Исключение
Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+ИдентРеквизита+"""");
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Код 1C v 8.х // Ярослав Волохов aka YVolohov
// Функция проверяет заполнение шапки или табличной части справочника, документа или плана, бизнес-процесса, задачи
// Параметры:
// пИмяТаблицы (строка) - имя табличной части объекта, если не указано то будет проверятся шапка объекта
// пИменаПолей (массив строк) - имена проверяемых реквизитов объекта
// пВыводитьСообщения - если это свойство установлено в "Истина" то будут выводится сообщения в табло о
// незаполненных реквизитах таблицы, если не установлено - то не будут
// пСсылка (ссылка) - ссылка на элемент справочника или плана, документ, по которому будет произведена проверка
// Возвращаемое значение:
// Истина - если все реквизиты найдены и заполнены
// Ложь - если хоть один реквизит не заполнен, табличная часть не найдена
// или хоть один реквизит не найден
Функция ПроверитьЗаполнениеТаблицыОбъекта(пИмяТаблицы = Неопределено,
пИменаПолей, пВыводитьСообщения = Истина, пСсылка) Экспорт
МассивСообщений = Новый Массив;
ЗначениеВозврата = Истина;
МетаданныеОбъекта = пСсылка.Метаданные();
Если НЕ(пИмяТаблицы = Неопределено) Тогда
МетаданныеТаблицы = МетаданныеОбъекта.ТабличныеЧасти.Найти(пИмяТаблицы);
Иначе
МетаданныеТаблицы = МетаданныеОбъекта;
КонецЕсли;
// Проверка существования табличной части
Если НЕ(МетаданныеТаблицы = Неопределено) Тогда
МассивМетаданныхРеквизитов = Новый Массив;
МетаданныеРеквизитов = МетаданныеТаблицы.Реквизиты;
// Проверка существования полей
Для Каждого ИмяПоля Из пИменаПолей Цикл
МетаданныеРеквизита = МетаданныеРеквизитов.Найти(ИмяПоля);
Если НЕ(МетаданныеРеквизита = Неопределено) Тогда
МассивМетаданныхРеквизитов.Добавить(МетаданныеРеквизита);
Иначе
Если пИмяТаблицы = Неопределено Тогда
МассивСообщений.Добавить("Реквизит шапки с именем '" + ИмяПоля + "' не найден !!!");
Иначе
МассивСообщений.Добавить("Реквизит табличной части '" + пИмяТаблицы + "' с именем '" +
ИмяПоля + "' не найден !!!");
КонецЕсли;
ЗначениеВозврата = Ложь;
КонецЕсли;
КонецЦикла;
// Проверка заполнения полей
КоличествоСтрокТаблицы = ?(НЕ(пИмяТаблицы = Неопределено), пСсылка[пИмяТаблицы].Количество(), 1);
КоличествоСтрокТаблицы = ?(МассивМетаданныхРеквизитов.Количество() > 0, КоличествоСтрокТаблицы, 0);
// Обход строк таблицы
Для НомерСтрокиТаблицы = 1 По КоличествоСтрокТаблицы Цикл
СтрокаТаблицы = ?(НЕ(пИмяТаблицы = Неопределено),
пСсылка[пИмяТаблицы].Получить(НомерСтрокиТаблицы - 1), пСсылка);
// Обход списка проверяемых реквизитов
Для Каждого ЭлементМетаданныхРеквизитов Из МассивМетаданныхРеквизитов Цикл
// Получение значения ячейки и проверка ее заполнения
ЗначениеЯчейкиТЧ = СтрокаТаблицы[ЭлементМетаданныхРеквизитов.Имя];
ЯчейкаПустая = НЕ(ЗначениеЗаполнено(ЗначениеЯчейкиТЧ));
// Если значение пустое, добавляем сообщение в массив сообщений
Если ЯчейкаПустая Тогда
Если пИмяТаблицы = Неопределено Тогда
МассивСообщений.Добавить("Реквизит шапки с именем '" + ЭлементМетаданныхРеквизитов.Имя + "' не заполнен !!!");
Иначе
МассивСообщений.Добавить("В строке № " + НомерСтрокиТаблицы + " табличной части '" +
пИмяТаблицы + "' не заполнен реквизит с именем '" + ЭлементМетаданныхРеквизитов.Имя + "' !!!");
КонецЕсли;
ЗначениеВозврата = Ложь;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Иначе
МассивСообщений.Добавить("Табличная часть с именем '" + пИмяТаблицы + "' не найдена !!!");
ЗначениеВозврата = Ложь;
КонецЕсли;
// Здесь выводим все сообщения
Если пВыводитьСообщения Тогда
Для Каждого ТекстСообщения Из МассивСообщений Цикл
Сообщить(ТекстСообщения, СтатусСообщения.Важное);
КонецЦикла;
КонецЕсли;
Возврат ЗначениеВозврата;
КонецФункции
Категория:
Работа с Формой (Диалог) и её элементами Функция формирует объект Структура, содержащая метаданные 77 для составления прямых запросов Код 1C v 8.х Функция ЗагрузитьМетаданные(КаталогИБ, ИмяПользователяV7, ПарольПользователяV7) Экспорт
МД = Новый Структура;
Состояние("Подключение к " + КаталогИБ);
V7 = Новый COMОбъект("V77.Application");
Если V7.Initialize(V7.RMTrade, "/d"""+КаталогИБ+""" /n"+ИмяПользователяV7+" /p"+ПарольПользователяV7, "NO_SPASH_SHOW") = 0 Тогда
Сообщить("Нет доступа к информационной базе.");
Возврат Ложь;
КонецЕсли;
MDW = V7.CreateObject("MetaDataWork");
MD = V7.Метаданные;
Состояние("Загрузка справочников..");
Ст1 = Новый Структура;
МД.Вставить("Справочник", Ст1);
Для Номер1 = 1 По MD.Справочник() Цикл
МДСправочник = MD.Справочник(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДСправочник.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДСправочник));
Для Номер2 = 1 По МДСправочник.Реквизит() Цикл
МДРеквизит = МДСправочник.Реквизит(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Состояние("Загрузка перечислений..");
Ст1 = Новый Структура;
МД.Вставить("Перечисление", Ст1);
Для Номер1 = 1 По MD.Перечисление() Цикл
МДПеречисление = MD.Перечисление(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДПеречисление.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДПеречисление));
Для Номер2 = 1 По МДПеречисление.Значение() Цикл
МДЗначение = МДПеречисление.Значение(Номер2);
Ст2.Вставить(МДЗначение.Идентификатор, V7.EvalExpr("_idtostr("+MDW.ИДОбъекта(МДЗначение)+")")+" ");
КонецЦикла;
КонецЦикла;
Состояние("Загрузка документов..");
Ст1 = Новый Структура;
МД.Вставить("Документ", Ст1);
Для Номер1 = 1 По MD.Документ() Цикл
МДДокумент = MD.Документ(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДДокумент.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДДокумент));
Для Номер2 = 1 По МДДокумент.РеквизитШапки() Цикл
МДРеквизит = МДДокумент.РеквизитШапки(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
Для Номер2 = 1 По МДДокумент.РеквизитТабличнойЧасти() Цикл
МДРеквизит = МДДокумент.РеквизитТабличнойЧасти(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Состояние("Загрузка регистров..");
Ст1 = Новый Структура;
МД.Вставить("Регистр", Ст1);
Для Номер1 = 1 По MD.Регистр() Цикл
МДРегистр = MD.Регистр(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДРегистр.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДРегистр));
Для Номер2 = 1 По МДРегистр.Измерение() Цикл
МДИзмерение = МДРегистр.Измерение(Номер2);
Ст2.Вставить(МДИзмерение.Идентификатор, MDW.ИДОбъекта(МДИзмерение));
КонецЦикла;
Для Номер2 = 1 По МДРегистр.Ресурс() Цикл
МДРесурс = МДРегистр.Ресурс(Номер2);
Ст2.Вставить(МДРесурс.Идентификатор, MDW.ИДОбъекта(МДРесурс));
КонецЦикла;
Для Номер2 = 1 По МДРегистр.Реквизит() Цикл
МДРеквизит = МДРегистр.Реквизит(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Константы.МетаданныеУдаленнойИБ.Установить(Новый ХранилищеЗначения(МД));
Возврат Истина;
КонецФункции
Формируется конечно не быстро, но Структура - объект сериализуемый, поэтому ее надо просто хранить в ХранилищеЗначения в базе 8ки, и восстанавливать перед каждым переносом данных, а не формировать заново. Обновлять ее можно периодически при изменении конфигурации, ито если изменения влияют на перенос данных.
Обратите внимание: все идентификаторы объектов в 10ой системе, а идентификаторы значений перечислений в 36ой.
DmitrO Категория:
COM-объекты, WMI, WSH Делаем быстрый поиск по списку Справочника, Документов. Сразу оговорюсь, пример для списка справочника Контрагенты, но подобное я использую очень часто.
И так: Менеджерам хочется открыть список контрагентов, и быстро найти контрагента по любым данным которые они помнят!
Реализованно следующим образом:
1. На форму в Командную панель Действия формы добавленно 2 Кнопки
а) Найтиконтр (с картинкой поиск,
Процедура НайтиКонтр(Кнопка) ) будет использоваться для запроса данных у пользователя для отбора
б) Инф (с картинкой бинокль) будет отображать параметр текущего запроса
в) В свойствах табличного поля добавим Событие При Активизации Колонки -
Процедура ИзмНазваниеКнопки(Элемент)
2. В модуль добавим код:
Код 1C v 8.х
Процедура НайтиКонтр(Кнопка)
Если элементыформы.ДействияФормы.Кнопки.Найтиконтр.текст ="Показать все задания" Тогда
СправочникСписок.Отбор.Сбросить();
элементыформы.ДействияФормы.Кнопки.Найтиконтр.текст ="Поиск по "+ЭлементыФормы.СправочникСписок.ТекущаяКолонка.ТекстШапки;
элементыформы.ДействияФормы.Кнопки.инф.текст="Отбора нет";
Иначе
Текст = "";
Подсказка = "Поиск по "+ЭлементыФормы.СправочникСписок.ТекущаяКолонка.ТекстШапки;
Типзнач=ЭлементыФормы.СправочникСписок.ТекущаяКолонка.ЭлементУправления.ТипЗначения;
Если ВвестиЗначение(Текст, Подсказка,Типзнач) Тогда
Попытка
СправочникСписок.Отбор[ЭлементыФормы.СправочникСписок.ТекущаяКолонка.имя].ВидСравнения = ВидСравнения.Содержит;
СправочникСписок.Отбор[ЭлементыФормы.СправочникСписок.ТекущаяКолонка.имя].Значение = текст;
СправочникСписок.Отбор[ЭлементыФормы.СправочникСписок.ТекущаяКолонка.имя].Использование = Истина;
элементыформы.ДействияФормы.Кнопки.инф.текст="Отбор: Содержит - "+ЭлементыФормы.СправочникСписок.ТекущаяКолонка.ТекстШапки+" = "+ВРег(строка(текст));
элементыформы.ДействияФормы.Кнопки.Найтиконтр.текст ="Показать все задания";
Исключение
СправочникСписок.Отбор[ЭлементыФормы.СправочникСписок.ТекущаяКолонка.имя].ВидСравнения = ВидСравнения.Равно;
СправочникСписок.Отбор[ЭлементыФормы.СправочникСписок.ТекущаяКолонка.имя].Значение = текст;
СправочникСписок.Отбор[ЭлементыФормы.СправочникСписок.ТекущаяКолонка.имя].Использование = Истина;
элементыформы.ДействияФормы.Кнопки.инф.текст="Отбор: Равно - "+ЭлементыФормы.СправочникСписок.ТекущаяКолонка.ТекстШапки+" = "+ВРег(строка(текст));
элементыформы.ДействияФормы.Кнопки.Найтиконтр.текст ="Показать все задания";
Конецпопытки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ИзмНазваниеКнопки(Элемент)
Если не элементыформы.ДействияФормы.Кнопки.Найтиконтр.текст ="Показать все задания" Тогда
элементыформы.ДействияФормы.Кнопки.Найтиконтр.текст ="Поиск по "+ЭлементыФормы.СправочникСписок.ТекущаяКолонка.ТекстШапки;
КонецЕсли;
КонецПроцедуры
В результате перемещаясь по колонкам списка, меняется
Поиск по...(Названию колонки)
Для примера нужно быстро получить список Контрагентов у которых телефон содержит 783
Результат:
Автор: Евгений Мигачев Категория:
Список Справочника, Документов, Регистров