Циклы в языке 1С, примеры и тест - какой цикл быстрее? Циклы применяются для выполнения каких либо повторяющихся действий, возможные варианты перебора в цикле:
Перебираем строки с помощью цикла Для каждого
Код 1C v 8.3 Для каждого ТекСтрока Из КоллекцияСтрок Цикл
КонецЦикла ;
Перебираем строки с помощью цикла Пока
Код 1C v 8.3 Пока л < КолСтрок Цикл
КонецЦикла ;
Перебираем строки с помощью цикла Для
Код 1C v 8.3 Для л= 0 по КолСтрок Цикл
КонецЦикла
Еще вариант, но советую его использовать только в без выходных ситуациях, Если
Код 1C v 8.3 ~НачалоЦикла:
Если л < > КоличествоИтераций Тогда
Перейти ~НачалоЦикла;
КонецЕсли ;
Примеры циклов Код 1C v 8.2 УП &НаКлиенте
Процедура ВыполнитьКод(Команда)
Для Счетчик = 1 По 5 Цикл
Сообщить( Счетчик) ;
КонецЦикла ;
Дни = Новый Массив( ) ;
Дни. Добавить( "Понедельник" ) ;
Дни. Добавить( "Вторник" ) ;
Дни. Добавить( "Среда" ) ;
Для Каждого Элемент Из Дни Цикл
Сообщить( Элемент) ;
КонецЦикла ;
Счетчик = 0 ;
Пока Счетчик < Дни. Количество( ) Цикл
Сообщить( Дни[Счетчик]) ;
Счетчик = Счетчик + 1 ;
КонецЦикла ;
Счетчик = Дни. Количество( ) - 1 ;
Пока Счетчик > = 0 Цикл
Сообщить( Дни[Счетчик]) ;
Счетчик = Счетчик - 1 ;
КонецЦикла ;
Для Счетчик = 1 По 5 Цикл
Если Счетчик > 2 Тогда
Прервать ;
КонецЕсли ;
Сообщить( Счетчик) ;
КонецЦикла ;
Для Счетчик = 1 По 5 Цикл
Если Счетчик < > 3 Тогда
Продолжить;
КонецЕсли ;
Сообщить( Счетчик) ;
КонецЦикла ;
КонецПроцедуры
А какой цикл работает быстрее? Итак, я нашел пять способов, как можно организовать цикл средствами 1С.
Первый вид цикла, назовем его условно «Для По » выглядит так:
Код 1C v 8.х Для н = 0 по КоличествоИтераций Цикл
КакиеТоДействия( ) ;
КонецЦикла ;
Второй вид «Для Каждого »:
Код 1C v 8.х Для Каждого ЭлементКоллекции из Коллекция Цикл
КакиеТоДействия( ) ;
КонецЦикла ;
Третий «Пока »:
Код 1C v 8.х Пока н < > КоличествоИтераций Цикл
КакиеТоДействия( ) ;
н = н + 1 ;
КонецЦикла ;
Далее вспомнил ассемблерную молодость & цикл «Если »:
Код 1C v 8.х ~НачалоЦикла:
Если н < > КоличествоИтераций Тогда
КакиеТоДействия( ) ;
н = н + 1 ;
Перейти ~НачалоЦикла;
КонецЕсли ;
Ну и напоследок «Рекурсия »
Код 1C v 8.х Процедура РекурсивныйЦикл(н, КоличествоИтераций)
КакиеТоДействия( ) ;
Если н < > КоличествоИтераций Тогда
РекурсивныйЦикл( н+ 1 , КоличествоИтераций) ;
КонецЕсли ;
КонецПроцедуры
Естественно, что относить рекурсию к циклам не совсем корректно, но тем ни менее с её помощью можно добиться похожих результатов. Сразу оговорюсь, что в дальнейшем тестировании рекурсия не участвовала. Во первых все тесты проводились при 1 000 000 итераций, а рекурсия выпадает уже при 2 000. Во вторых скорость рекурсии в десятки раз меньше, чем скорость остальных циклов.
Последнее отступление. Одним из условий было выполнение в цикле каких-либо действий. Во первых пустой цикл используется очень редко. Во вторых цикл «ДляКаждого» используется для какой-либо коллекции, а значит и остальные циклы должны работать с коллекцией, чтобы тестирование проходило в одинаковых условиях.
Ну что ж, поехали. В качестве тела цикла использовалось чтение из заранее заполненного массива.
Код 1C v 8.х ПриемникТестовогоЗначения = ТестовыйМассив. Получить( н) ;
или, при использовании цикла «Для Каждого »
Код 1C v 8.х ПриемникТестовогоЗначения = Элем;
Тестирование проводилось на платформе 8.3.5.1231 для трех видов интерфейса (Обычное приложение, Управляемое приложение и Такси).
Результаты для 8.3.5.1231
Интерфейс ДляПо ДляКаждого Пока Если Обычное приложение 5734,2 4680,4 7235,4 7263,0 Управляемое приложение 5962,4 4882,6 7497,4 7553,6 Такси 5937,2 4854,6 7500,8 7513,0
Числа это время в миллисекундах полученное с помощью функции ТекущаяУниверсальнаяДатаВМиллисекундах() , которую я вызывал до цикла и после его завершения. Числа дробные, потому что я использовал среднее арифметическое пяти замеров. Почему я не использовал Замер производительности? У меня не было цели замерить скорость каждой строчки кода, только скорость циклов с одинаковым результатом работы.
Казалось бы и все, но & тестировать так тестировать!
Результаты для 8.2.19.106
Интерфейс ДляПо ДляКаждого Пока Если Обычное приложение 4411,8 3497,2 5432,0 5454,0 Управляемое приложение 4470,8 3584,8 5522,6 5541,0
В среднем платформа 8.2 на 25% быстрее, чем 8.3. Я немножко не ожидал такой разницы и решил провести тест на другой машине. Скажу только, что там 8.2 была быстрее процентов на 20.
Почему? Не знаю, дезасемблировать ядро в мои планы не входило, но в замер производительности я все же заглянул. Оказалось, что сами циклические операции в 8.3 проходят несколько быстрее, чем в 8.2. Но на строке
Код 1C v 8.х ПриемникТестовогоЗначения = ТестовыйМассив. Получить( н) ;
то есть при считывании элемента коллекции в переменную происходит значительное снижение производительность.
Для себя я сделал несколько выводов:
1. Если есть возможность использовать специализированный цикл & «Для Каждого», то лучше использовать его. Кстати, сам по себе он отрабатывает дольше чем другие циклы, но скорость доступа к элементу коллекции у него на много выше.
2. Если заранее знаешь количество итераций & используй «Для По». «Пока» отработает медленнее.
3. Если использовать цикл «Если» & другие программисты тебя явно не поймут.
В статье использованы материалы с хабра и хелпме
Категория:
Встроенные Функции Календарь ~ Указали несколько дат в поле календаря - как их перебрать? Код 1C v 8.х // установим множественный выбор
ЭлементыФормы.ПолеКалендаря.РежимВыделения = РежимВыделенияДаты.Множественный;
//Когда выбрали перебираем
КоллекцияДат = ЭлементыФормы.ПолеКалендаря.ВыделенныеДаты;
Для каждого ДатаКалендаря из КоллекцияДат Цикл
Сообщить(ДатаКалендаря);
КонецЦикла;
Категория:
Работа с Формой (Диалог) и её элементами Получение данных по границам последовательности Для получения таблицы значений, в первой колонке которой будут указаны границы последовательности, а в последующих – значения измерений, можно применить метод последовательности ПолучитьГраницы():
Код 1C v 8.х
ТаблицаГраниц = Последовательности. ПартионныйУчет. ПолучитьГраницы( "Организация" ) ;
Для Каждого СтрокаТаблицыГраниц из ТаблицаГраниц Цикл
Организация = СтрокаТаблицыГраниц. Организация;
ДатаГП = СтрокаТаблицыГраниц. Граница. Дата;
СсылкаГП = СтрокаТаблицыГраниц. Граница. Ссылка;
КонецЦикла ;
В качестве параметра методу достаточно передать название измерения (если нужно несколько, можно через запятую).
Далее в цикле
перебираем полученную таблицу значений, считывая данные из колонок Граница и Организация.
Замечание: если границы нужны не все (по организациям), а только наименьшая из них, лучше применять метод ПолучитьГраницу(). Он возвращает уже не таблицу, а именно момент времени.
Категория:
Документы Как поменять период у записей периодического независимого регистра, соответствующих ряду условий? В периодическом независимом регистре сведений ОтветственныеЛицаОрганизации все записи, касающиеся организации с наименованием Групп-трейдинг, период которых меньше 01 января 2005 года, необходимо перенести на 01 января 2004 года. Но записи с указанием должностей Продавец и Кладовщик должны остаться на своих местах.
Сначала получим таблицу записей, которые подлежат модификации. Поскольку условий несколько, да еще и не на равенство, оптимальнее это сделать при помощи запроса. А потом, перебирая результат запроса, добьемся требуемого результата:
Код 1C v 8.х
Процедура ЗаменаПериода()
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ОтветственныеЛицаОрганизации.Период,
| ОтветственныеЛицаОрганизации.СтруктурнаяЕдиница,
| ОтветственныеЛицаОрганизации.ОтветственноеЛицо
|ИЗ
| РегистрСведений.ОтветственныеЛицаОрганизации КАК ОтветственныеЛицаОрганизации
|ГДЕ
| ОтветственныеЛицаОрганизации.Период <= ДАТАВРЕМЯ(2005, 1, 1)
| И
| ОтветственныеЛицаОрганизации.СтруктурнаяЕдиница.Наименование ПОДОБНО "" Групп-Трейдинг""
| И
| (ОтветственныеЛицаОрганизации.Должность.Наименование ЕСТЬ NULL
| ИЛИ
| НЕ(ОтветственныеЛицаОрганизации.Должность.Наименование ПОДОБНО "" Продавец""
| ИЛИ
| ОтветственныеЛицаОрганизации.Должность.Наименование ПОДОБНО "" Кладовщик"" ))" ;
Результат = Запрос. Выполнить( ) ;
Выборка = Результат. Выбрать( ) ;
Запись = РегистрыСведений. ОтветственныеЛицаОрганизации. СоздатьМенеджерЗаписи( ) ;
Пока Выборка. Следующий( ) Цикл
Запись. Период = Выборка. Период;
Запись. СтруктурнаяЕдиница = Выборка. СтруктурнаяЕдиница;
Запись. ОтветственноеЛицо = Выборка. ОтветственноеЛицо;
Запись. Прочитать( ) ;
Если Запись. Выбран( ) Тогда
Запись. Период = Дата( 2004 , 1 , 1 ) ;
Запись. Записать( ) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры ;
Результат запроса – таблица, в которой по каждой записи заполнены все поля измерений из регистра и поле Период. Именно эту информацию мы используем для получения каждой нужной записи.
Источником данных для запроса послужила таблица РегистрСведений.ОтветственныеЛицаОрганизации.
Отборы были применены так, чтобы в результат попали записи с периодом менее 1 января 2005 года, наименование структурных единиц в которых – Групп-трейдинг, а наименования должностей не относятся к Продавец и Кладовщик. Кроме того, необходимо позаботиться о случае, когда должность вообще не указана, то есть ее наименование имеет значение NULL. Такие записи тоже нужно будет переносить.
Запрос выполнен, далее
перебираем его результат и посредством менеджера записи регистра ОтветственныеЛицаОрганизации добиваемся желаемого. При каждом проходе цикла считываем очередную запись, предварительно указав значение ее поля Период и полей измерений.
Далее меняем значение поля Период у считанной записи и записываем ее в регистр.
Категория:
Регистры сведений Как сформировать новый документ на основании файла, шаблона Microsoft Office Word и OpenOffice? Код 1C v 8.х Перем СсылкаНаДокумент;
Процедура СформироватбФайл_MS_Word_И_OpenOffice(Кнопка)
ДокументСсылка = СсылкаНаДокумент;
ИмяФайла = ПолучитьИмяВременногоФайла( ) ;
Попытка
MSWord = новый COMОбъект( "Word.Application" ) ;
MSWord. Documents. Open( ИмяФайла) ;
MSWordDoc = MSWord. ActiveDocument( ) ;
WordContent = MSWord. ActiveDocument( ) . ActiveWindow. S_election;
Для ТекущаяТаблица = 1 ПО MSWordDoc. Tables. Count Цикл
мТабличнаяЧасть = Неопределено ;
Для ТекущаяСтрока = 1 ПО MSWordDoc. Tables( ТекущаяТаблица) . Rows. Count Цикл
Для ТекущаяКолонка = 1 ПО MSWordDoc. Tables( ТекущаяТаблица) . Columns. Count Цикл
мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
ПолучитьСтартПеременной( MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока, ТекущаяКолонка) . Range. Text )
, ДокументСсылка) ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
ВсегоСтрокТЧ = 0 ;
Для Каждого строкаТЧ Из ДокументСсылка[мТабличнаяЧасть. Имя] Цикл
ВсегоСтрокТЧ = ВсегоСтрокТЧ+ 1 ;
КонецЦикла ;
Для ТекущаяСтрокаТЧ = 1 По ВсегоСтрокТЧ Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
MSWordDoc. Tables( ТекущаяТаблица) . Rows. Add( MSWordDoc. Tables( ТекущаяТаблица) . Rows( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) ) ;
КонецЕсли ;
Для ТекКол = 1 ПО MSWordDoc. Tables( ТекущаяТаблица) . Columns. Count Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ, ТекКол) . Range. Text) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , ТекКол) . Range. Text = ТекстПеременной;
Иначе
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , ТекКол) . Range. Text) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , ТекКол) . Range. Text = ТекстПеременной;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ТекстДокумента = MSWordDoc. Range( 0 , MSWordDoc. Characters. Count) . Text;
Список = ПолучитьСписокПеременных( ТекстДокумента) ;
СтруктураРеквизитов= СтруктураРеквизитовДокумента( ДокументСсылка) ;
ЗначениеРеквизита= "" ;
Для Каждого ЭлементСписка Из Список Цикл
Если СтруктураРеквизитов. Свойство( ЭлементСписка. Значение, ЗначениеРеквизита ) Тогда
WordContent. Find. Execute( "[" + ЭлементСписка. Значение+ "]" , 0 , 0 , 0 , 0 , 0 , - 1 , , , Строка( ЗначениеРеквизита) , 2 ) ;
Иначе
Сообщить( "-> " + ЭлементСписка. Значение+ " - Не найден в структуре документа" ) ;
WordContent. Find. Execute( "[" + ЭлементСписка. Значение+ "]" , 0 , 0 , 0 , 0 , 0 , - 1 , , , " " , 2 ) ;
КонецЕсли ;
КонецЦикла ;
MSWord. S_election. WholeStory( ) ;
MSWord. S_election. Fields. Update( ) ;
MSWord. S_election. HomeKey( ) ;
MSWord. Visible= 1 ;
MSWord. Activate( ) ;
Исключение
Предупреждение( ОписаниеОшибки( ) ) ;
MSWord. Quit( ) ;
КонецПопытки ;
Попытка
ServiceManager = Новый COMОбъект( "com.sun.star.ServiceManager" ) ;
Reflection = ServiceManager. createInstance( "com.sun.star.reflection.CoreReflection" ) ;
Desktop = ServiceManager. createInstance( "com.sun.star.frame.Desktop" ) ;
Args = Новый COMSafeArray( "VT_DISPATCH" , 1 ) ;
OOДокумент = Desktop. loadComponentFromURL( ПреобразоватьВURL( ИмяФайла) , "_blank" , 0 , Args) ;
Для ТекущаяТаблица = 0 ПО OOДокумент. getTextTables( ) . Count- 1 Цикл
мТабличнаяЧасть = Неопределено ;
Для ТекущаяСтрока = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Rows. Count- 1 Цикл
Для ТекущаяКолонка = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Columns. Count- 1 Цикл
мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
ПолучитьСтартПеременной( OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекущаяКолонка, ТекущаяСтрока) . string )
, ДокументСсылка) ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
ВсегоСтрокТЧ = 0 ;
Для Каждого строкаТЧ Из ДокументСсылка[мТабличнаяЧасть. Имя] Цикл
ВсегоСтрокТЧ = ВсегоСтрокТЧ+ 1 ;
КонецЦикла ;
Для ТекущаяСтрокаТЧ = 1 По ВсегоСтрокТЧ Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Rows. I_nsertByIndex( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , 1 ) ;
КонецЕсли ;
Для ТекКол = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Columns. Count- 1 Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ) . string) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) . string = ТекстПеременной;
Иначе
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) . string) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) . string = ТекстПеременной;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ТекстДокумента = ООПолучитьТекст( OOДокумент) ;
Список = ПолучитьСписокПеременных( ТекстДокумента) ;
СтруктураРеквизитов= СтруктураРеквизитовДокумента( ДокументСсылка) ;
ЗначениеРеквизита= "" ;
OOЗамена = OOДокумент. CreateReplaceDescriptor( ) ;
Для Каждого ЭлементСписка Из Список Цикл
Если СтруктураРеквизитов. Свойство( ЭлементСписка. Значение, ЗначениеРеквизита ) Тогда
OOЗамена. SearchString = "[" + ЭлементСписка. Значение+ "]" ;
OOЗамена. ReplaceString = Строка( ЗначениеРеквизита) ;
OOДокумент. ReplaceAll( OOЗамена) ;
Иначе
Сообщить( "-> " + ЭлементСписка. Значение+ " - Не найден в структуре документа" ) ;
OOЗамена. SearchString = "[" + ЭлементСписка. Значение+ "]" ;
OOЗамена. ReplaceString = " " ;
OOДокумент. ReplaceAll( OOЗамена) ;
КонецЕсли ;
КонецЦикла ;
OOДокумент. getCurrentController( ) . getFrame( ) . getContainerWindow( ) . setFocus( ) ;
Исключение
Предупреждение( ОписаниеОшибки( ) ) ;
КонецПопытки ;
КонецПроцедуры
Код 1C v 8.х
Процедура ДобавитьФорматы(ПереченьРеквизитов,Значение,пПредставлениеРеквизита, ДокументСсылка = Неопределено)
Если ТипЗнч( Значение) = Тип( "Дата" ) Тогда
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ДФddMMyyyy" , Формат( Значение, "ДФ=dd.MM.yyyy" ) ) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ДЛФDD" , Формат( Значение, "ДЛФ=DD" ) ) ;
ИначеЕсли ТипЗнч( Значение) = Тип( "Число" ) Тогда
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ЧДЦ2ЧГ0" , Формат( Значение, "ЧДЦ=2; ЧГ=0" ) ) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ЧДЦ2" , Формат( Значение, "ЧДЦ=2" ) ) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ЧПропись" , Значение) ;
ИначеЕсли ( ТипЗнч( Значение) = Тип( "СправочникСсылка.КонтактныеЛица" ) ) или ( ТипЗнч( Значение) = Тип( "СправочникСсылка.ФизическиеЛица" ) ) Тогда
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ФИО" , Строка( Значение) ) ;
КонецЕсли
КонецПроцедуры
Процедура ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,РеквизитСсылка,Реквизит,пПредставлениеРеквизита)
мГлубинаРекурсии = мГлубинаРекурсии+ 1 ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "Код" , РеквизитСсылка["Код" ]) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "Наименование" , РеквизитСсылка["Наименование" ]) ;
Для Каждого ЭлементРеквизита Из Реквизит. Реквизиты Цикл
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + ЭлементРеквизита. Имя, РеквизитСсылка[ЭлементРеквизита. Имя]) ;
Если ( Найти( ЭлементРеквизита. Тип, "Справочник ссылка" ) > 0 ) И ( мГлубинаРекурсии < = 3 ) И ( Найти( ЭлементРеквизита. Тип, "," ) = 0 ) Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, РеквизитСсылка[ЭлементРеквизита. Имя], РеквизитСсылка[ЭлементРеквизита. Имя]. Метаданные( ) , пПредставлениеРеквизита+ "_" + ЭлементРеквизита. Имя) ;
Иначе
ДобавитьФорматы( ПереченьРеквизитов, РеквизитСсылка[ЭлементРеквизита. Имя], пПредставлениеРеквизита+ "_" + ЭлементРеквизита. Имя) ;
КонецЕсли
КонецЦикла ;
КонецПроцедуры
Функция ПолучитьСписокПеременных(ТекстШаблона)
СписокПеременных = Новый СписокЗначений( ) ;
ЕщеЕсть = Истина ;
Пока ЕщеЕсть Цикл
ПервыйСимвол = Найти( ТекстШаблона, "[" ) ;
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти( ТекстШаблона, "]" ) ;
Если ( ВторойСимвол > 0 И ВторойСимвол > ПервыйСимвол) Тогда
СписокПеременных. Добавить( Сред( ТекстШаблона, ПервыйСимвол + 1 , ВторойСимвол - ПервыйСимвол - 1 ) ) ;
ТекстШаблона = Сред( ТекстШаблона, ВторойСимвол + 1 ) ;
Иначе
ЕщеЕсть = Ложь ;
КонецЕсли ;
Иначе
ЕщеЕсть = Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат СписокПеременных;
КонецФункции
Функция СтруктураРеквизитовДокумента(ДокументСсылка) Экспорт
ПереченьРеквизитов = Новый Структура;
ПереченьРеквизитов. Вставить( "Дата" , ДокументСсылка["Дата" ]) ;
ДобавитьФорматы( ПереченьРеквизитов, ДокументСсылка["Дата" ], "Дата" ) ;
ПереченьРеквизитов. Вставить( "Номер" , ДокументСсылка["Номер" ]) ;
Реквизиты = ДокументСсылка. Метаданные( ) . Реквизиты;
Для Каждого Реквизит Из Реквизиты Цикл
мГлубинаРекурсии = 1 ;
ПереченьРеквизитов. Вставить( Реквизит. Имя, ДокументСсылка[Реквизит. Имя]) ;
ДобавитьФорматы( ПереченьРеквизитов, ДокументСсылка[Реквизит. Имя], Реквизит. Имя, ДокументСсылка) ;
Если Найти( Реквизит. Тип, "Справочник ссылка" ) > 0 Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, ДокументСсылка[Реквизит. Имя], ДокументСсылка[Реквизит. Имя]. Метаданные( ) , Реквизит. Имя) ;
Иначе
КонецЕсли ;
КонецЦикла ;
ТабличныеЧасти = ДокументСсылка. Метаданные( ) . ТабличныеЧасти;
Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
Если ТабличнаяЧасть. Имя = "Характеристики" Тогда
Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть. Имя] Цикл
мПредставлениеРеквизита = "Характеристика" + "_" + СтрЗаменить( СтрокаТабличнойЧасти["ВидХарактеристики" ], " " , "_" ) ;
мЗначение = СтрокаТабличнойЧасти["ЗначениеХарактеристики" ];
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, мЗначение) ;
ДобавитьФорматы( ПереченьРеквизитов, мЗначение, мПредставлениеРеквизита, ДокументСсылка) ;
Если Найти( ТипЗнч( мЗначение) , "Справочник ссылка" ) > 0 Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, мЗначение, мЗначение. Метаданные( ) , мПредставлениеРеквизита) ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
Реквизиты = ТабличнаяЧасть. Реквизиты;
Для Каждого Реквизит Из Реквизиты Цикл
Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть. Имя] Цикл
мГлубинаРекурсии = 1 ;
мПредставлениеРеквизита = "_" + СтрокаТабличнойЧасти. НомерСтроки+ "_" + ТабличнаяЧасть. Имя+ "_НомерСтроки" ;
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, Строка( СтрокаТабличнойЧасти. НомерСтроки) ) ;
мПредставлениеРеквизита = "_" + СтрокаТабличнойЧасти. НомерСтроки+ "_" + ТабличнаяЧасть. Имя+ "_" + Реквизит. Имя;
мЗначение = СтрокаТабличнойЧасти[Реквизит. Имя];
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, мЗначение) ;
ДобавитьФорматы( ПереченьРеквизитов, мЗначение, мПредставлениеРеквизита, ДокументСсылка) ;
Если Найти( ТипЗнч( мЗначение) , "Справочник ссылка" ) > 0 Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, мЗначение, мЗначение. Метаданные( ) , мПредставлениеРеквизита) ;
Иначе
КонецЕсли ;
КонецЦикла ;
Если Реквизит. Тип. СодержитТип( Тип( "Число" ) ) Тогда
мЗначение = ДокументСсылка[ТабличнаяЧасть. Имя]. Итог( Реквизит. Имя) ;
мПредставлениеРеквизита = "Итог" + "_" + ТабличнаяЧасть. Имя+ "_" + Реквизит. Имя;
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, мЗначение) ;
ДобавитьФорматы( ПереченьРеквизитов, мЗначение, мПредставлениеРеквизита, ДокументСсылка) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
Возврат ПереченьРеквизитов;
КонецФункции
Функция ИмяТабличнойЧастиВСтроке(Строка,ДокументСсылка)
ТабличнаяЧасть= Неопределено ;
Если НЕ ПустаяСтрока( Строка) Тогда
ТабличнаяЧасть = ДокументСсылка. Метаданные( ) . ТабличныеЧасти. Найти( Строка)
КонецЕсли ;
Возврат ТабличнаяЧасть;
КонецФункции
Функция ПолучитьСтартПеременной(ПереданнаяСтрока) Экспорт
СтартПеременной = "" ;
ПервыйСимвол = Найти( ПереданнаяСтрока, "[" ) ;
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти( ПереданнаяСтрока, "]" ) ;
Если ( ВторойСимвол > 0 ) И ( ВторойСимвол > ПервыйСимвол) Тогда
Переменная = ( Сред( ПереданнаяСтрока, ПервыйСимвол+ 1 , ВторойСимвол- ПервыйСимвол- 1 ) ) ;
ВторойСимвол = Найти( Переменная, "_" ) ;
Если ( ВторойСимвол > 0 ) И ( ВторойСимвол > 1 ) Тогда
СтартПеременной = Сред( Переменная, 1 , ВторойСимвол- 1 ) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
Возврат СтартПеременной;
КонецФункции
Функция ПолучитьПеременнуюИзСтроки(ПереданнаяСтрока) Экспорт
Переменная = "" ;
ПервыйСимвол = Найти( ПереданнаяСтрока, "[" ) ;
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти( ПереданнаяСтрока, "]" ) ;
Если ( ВторойСимвол > 0 ) И ( ВторойСимвол > ПервыйСимвол) Тогда
Переменная = ( Сред( ПереданнаяСтрока, ПервыйСимвол+ 1 , ВторойСимвол- ПервыйСимвол- 1 ) ) ;
КонецЕсли ;
КонецЕсли ;
Возврат Переменная;
КонецФункции
Функция ПреобразоватьВURL(ИмяФайла)
Возврат "file:///" + СтрЗаменить( ИмяФайла, "\" , "/" ) ;
КонецФункции
Функция ООПолучитьТекст(OOДокумент)
Текст = "" ;
oParEnum = OOДокумент. getText( ) . createEnumeration( ) ;
Пока oParEnum. hasMoreElements( ) Цикл
oPar = oParEnum. nextElement( ) ;
Если oPar. supportsService( "com.sun.star.text.Paragraph" ) ТОгда
Текст = Текст + oPar. getString( ) ;
ИначеЕсли oPar. supportsService( "com.sun.star.text.TextTable" ) Then
КонецЕсли ;
КонецЦикла ;
Для ТекущаяТаблица = 0 ПО OOДокумент. getTextTables( ) . Count- 1 Цикл
Для ТекущаяСтрока = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Rows. Count- 1 Цикл
Для ТекущаяКолонка = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Columns. Count- 1 Цикл
Текст = Текст + OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекущаяКолонка, ТекущаяСтрока) . string;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
Возврат Текст;
КонецФункции
Категория:
Работа с Microsoft Office и OpenOffice Работа с Почтой в 1С: Предприятие v 8 У разработчиков на платформе 1С иногда возникает задача по взаимодействию системы 1С: Предприятие с различными почтовыми программами и протоколами. 1С Предприятие 8.0 имеет довольно удобные средства для отправки сообщений, импорта писем из почтового клиента в справочник или другой объект конфигурации, работы с MAPI, SMTP или POP3.
При работе с почтой разделяют два способа доступа к почтовому ящику, почтовому клиенту:
объект "Почта" и объект "Интернет почта", каждый из объектов имеет свои достоинства.
Почта - предоставляет доступ к почте через встроенный почтовый клиент, работает по технологии MAPI.
Интернет почта - объект открывает возможности по доступу непосредственно к почтовым ящикам и учетным записям находящимися на почтовом сервере, использование и работа данного объекта не зависит от установленных в системе почтовых клиентов, даже если почтовый клиент установлен в системе "ИнтернетПочта" будет работать параллельно с ним, объект использует интернет-протоколы SMTP, POP3.
1.Получение сообщений объектом "Почта".
Для работы с объектом Почта необходимо наличие установленного на компьютере почтового клиента с описанными учетными записями.
Для подключения к почтовому клиенту у объекта есть метод "Подключиться".
Код 1C v 8.х
Почта = Новый Почта;
Почта. Подключиться( , ) ;
Первый параметр - имя профиля, к примеру, если в системе установлен MS Outlook, то как правило его профиль называется Outlook. Следовательно при подключении строка выглядела бы так:
Код 1C v 8.х
Почта. Подключиться( "Outlook" ) ;
Второй параметр отвечает за пароль к учетной записи.
Далее необходимо произвести выбор необходимых нам писем, для этой цели объект Почта имеет метод "Выбрать". У метода два параметра, первый отвечает за выбор непрочитанных писем - Истина (при Ложь будут выбраны все письма, находящиеся в папке "Входящие" почтового клиента), второй отвечает за выборку вложений, при Ложь, вложения выбираются.
//Выбираем все письма, со всеми вложениями.
Код 1C v 8.х Сообщения = Почта. Выбрать( Ложь , Ложь ) ;
(иногда при взаимодействии с Outlook 2003 возникает проблема, при которой 1С 8 просто аварийно завершает работу с ошибкой, именно на данной строке кода, это лечится установкой пакета обновления SP2 для MS Office 2003).
Далее после выборки сообщений необходимо перебрать их в цикле и сохранить, на форме необходимо добавить ТабличноеПоле1 куда будут сохраняться входящие письма.
Код 1C v 8.х Для каждого Сообщение Из Сообщения Цикл
СтрокаТП = ТабличноеПоле1 . Добавить( ) ;
Для каждого Получатель Из Письмо. Получатели Цикл
Получатели = Получатели + Получатель. Пользователь + " <" + Получатель. Адрес + "> " ;
КонецЦикла ;
СтрокаТП. Кому = Получатели;
Попытка
СтрокаТП. ОтКого= Сообщение. Отправитель. Адрес;
Исключение
СтрокаТП. ОтКого= Сообщение. Отправитель;
КонецПопытки ;
СтрокаТП. Тема = Сообщение. Тема;
СтрокаТП. Текст = Сообщение. Текст;
СтрокаТП. Дата = Сообщение. ДатаПолучения;
Для каждого Вложение Из Сообщение. Вложения Цикл
Вложение. Данные. Записать( Вложение. Наименование) ;
Влож= Влож+ Вложение. Наименование+ "," ;
КонецЦикла ;
СтрокаТП. ПутьВложения= Влож;
КонецЦикла ;
Почта. Отключиться( ) ;
Все реквизиты входящих писем сохраняются в соответствующие поля табличного поля, вложения сохраняются в каталог временных файлов, а имена вложений в реквизит табличного поля. Для более удобного хранения вложений писем, 1С 8 имеет тип "Хранилище значения", который позволяет хранить двоичные данные, далее при получении сообщений объектом ИнтернетПочта рассмотрим возможность хранения в "Хранилище значения".
2.Отправка сообщений объектом "Почта"
При отправке сообщения, подключение к почтовому клиенту производится точно так же, как и при получении, перед отправкой необходимо подготовить письмо.
Код 1C v 8.х Сообщение = Новый ПочтовоеСообщение;
Сообщение. Текст = "текст сообщения" ;
Сообщение. Отправитель = "petya@pupkin.com" ;
Сообщение. Тема = "Тема сообщения" ;
Сообщение. Получатели. Добавить( "vasya@pupkin.com" ) ;
Сообщение. Вложения. Добавить( Новый ДвоичныеДанные( "C:\file.jpg" ) , "file.jpg" ) ;
Почта = Новый Почта;
Почта. Подключиться( , ) ;
Попытка
Почта. Послать( Сообщение, Истина ) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
Почта. Отключиться( ) ;
В методе Почта.Послать(Сообщение,Истина) два параметра, первый принимает ссылку на почтовое сообщение, второй параметр определяет, требуется ли запрос на подтверждение о получении письма адресатом (Истина - запрос включен). После этих операций письмо попадает в папку "Исходящие" почтового клиента, и в зависимости от настроек клиента отправляется сразу или по команде пользователя.
В MS Outlook встроена защита от несанкционированного доступа к адресной книге и базе почтовых сообщений, и защита от несанкционированной отправки электронных писем через службы Outlook. В Outlook 2003 система безопасности срабатывает не только при попытке получить адрес отправителя письма, но даже при попытке получить его текст. В действительности защита выражается в показываемом пользователю окне системы безопасности при обращении к некоторым объектам и свойствам объектов Outlook и предлагает открыть доступ на определенное время, следует разрешить доступ.
3.Получение сообщений объектом "ИнтернетПочта".
Перед подключением к почтовому серверу, для объекта ИнтернетПочта необходимо заполнить данные Профиля учетной записи, и затем передать эти данные в метод "Подключиться".
Код 1C v 8.х Функция ПолучитьПрофиль()
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль. АдресСервераSMTP = "smtp.pupkin.com" ;
Профиль. ПортSMTP = 25 ;
Профиль. АдресСервераPOP3 = "pop.pupkin.com" ;
Профиль. ПортPOP3 = 110 ;
Профиль. Пароль = "pass" ;
Профиль. ПарольSMTP = "pass" ;
Профиль. Пользователь = "vasya" ;
Профиль. ПользовательSMTP = "vasya" ;
Профиль. ВремяОжидания = 50 ;
Возврат Профиль;
КонецФункции
Почта = Новый ИнтернетПочта;
Попытка
Почта. Подключиться( ПолучитьПрофиль( ) ) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
Заголовки= Почта. ПолучитьЗаголовки( )
Если Заголовки. Количество( ) = 0 Тогда
Предупреждение( "В почтовом ящике нет входящих сообщений!" , , "Нет сообщений" ) ;
КонецЕсли ;
Сообщения = Почта. Выбрать( Истина , Заголовки) ;
Для каждого Сообщение Из Сообщения Цикл
СтрокаТП = ТабличноеПолеИнтернетПочта. Добавить( ) ;
СтрокаТП. Дата = Сообщение. ДатаОтправления;
СтрокаТП. ОтКого = Сообщение. Отправитель. Пользователь + " <" + Сообщение. Отправитель. Адрес + "> " ;
СтрокаТП. Тема = Сообщение. Тема;
Для каждого Получатель Из Сообщение. Получатели Цикл
КомуВходящие = КомуВходящие + Получатель. Пользователь + " <" + Получатель. Адрес + "> " ;
КонецЦикла ;
СтрокаТП. Кому = КомуВходящие;
Для каждого ТекстСообщения Из Сообщение. Тексты Цикл
ТекстВходящие = ТекстВходящие + ТекстСообщения. Текст;
КонецЦикла ;
СтрокаТП. Текст = ТекстВходящие;
Для каждого Вложение Из Сообщение. Вложения Цикл
Вложение. Данные. Записать( Вложение. Name) ;
СправочникВложения. РеквизитВложение = новый ХранилищеЗначения( Новый ДвоичныеДанные( Вложение. Name) ) ;
СправочникВложения. ИмяВложения= Вложение. Name;
КонецЦикла ;
КонецЦикла ;
Почта. Отключиться( ) ;
Метод Почта.Выбрать(Истина,Заголовки); имеет два параметра, первый отвечает за удаление писем с сервера (при Истина-удалять), второй параметр отвечает за массив сообщений для выборки (т.е. закачки на компьютер клиента с сервера), если параметр пуст, то выбираются все сообщения находящиеся на сервере.
При переборе вложений, данные полученные из письма сохраняются в реквизит типа ХранилищеЗначения, заранее созданного справочника "СправочникВложения" в конфигураторе, т.к. данные первоначально сохраняются на диск, а затем загружаются в справочник, то, после загрузки в соответствующий реквизит справочника данные можно удалить. Не рекомендуется хранить данные типа ХранилищеЗначения в Табличных частях справочников, т.к. при больших объемах данных это затормаживает работу конфигурации.
4.Отправка сообщений объектом "ИнтернетПочта".
При отправке сообщения используется Функция ПолучитьПрофиль().
Код 1C v 8.х
Почта = Новый ИнтернетПочта;
Попытка
Почта. Подключиться( ПолучитьПрофиль( ) ) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение. Вложения. Добавить( Новый ДвоичныеДанные( "C:\file.jpg" ) , "file.jpg" ) ;
Сообщение. Отправитель = "vasya@pupkin.com" ;
Сообщение. ИмяОтправителя = "Вася" ;
ПочтовыеАдреса = Сообщение. Получатели;
ПочтовыйАдрес = ПочтовыеАдреса. Добавить( ) ;
ПочтовыйАдрес. Адрес = "petya@pupkin.com" ;
Сообщение. Тема = "Тема сообщения" ;
ИнтернетТекстПочтовогоСообщения = Сообщение. Тексты. Добавить( ) ;
ИнтернетТекстПочтовогоСообщения. Текст = "Текст сообщения" ;
ИнтернетТекстПочтовогоСообщения. ТипТекста = ТипТекстаПочтовогоСообщения. ПростойТекст;
Попытка
Почта. Послать( Сообщение) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
Почта. Отключиться( ) ;
Удобно подключить автополучение/автоотправку почты командой "ПодключитьОбработчикОжидания(,)". Первый параметр в команде отвечает за наименование вызываемой процедуры, и второй, период ожидания процедуры в секундах, обычно обработчик ожидания вставляется в глобальный модуль системы (например, в процедуру ПриНачалеРаботыСистемы()) и указывает на процедуру с пометкой Экспорт.
Например, можно создать процедуру ПроверитьПочту, в которую вставить загрузку писем из почтового ящика и вставить ее в следующую строку:
ПодключитьОбработчикОжидания("ПроверитьПочту",60)
Также для обработки и просмотра сообщений в формате HTML удобно пользоваться компонентом "Поле HTML документа", для загрузки HTML текста в компонент используется метод ПолеHTMLдокумента.УстановитьТекст(Html), где Html-это документа полученный из текста сообщения. Есть вариант загрузки HTML с диска (если это вложение), ПолеHTMLдокумента.Перейти("file:\\C:\File.html").
После использования нескольких или сразу всех способов работы с электронной почтой, образуется полноценный почтовый клиент с возможностью хранения и обработки писем с вложениями на базе 1С предприятие 8.0.
Автор:
Alimov Roman Как организовать работу с почтой без установленного почтового клиента на компьютере пользователя? Категория:
Работа с Интернет, Почтой (Mail), FTP Выгрузка метаданных конфигурации в Microsoft Word и Excel Код 1C v 8.х
Перем ОбъектыКонфы;
Перем СтруктКонфы;
Процедура ВыгрузитьВWord()
Попытка
Word = Новый COMОбъект( "Word.Application" ) ;
Исключение
Сообщить( "Не удалось открыть Word" ) ;
Возврат ;
КонецПопытки ;
Word. Documents. Add( ) ;
Документ = Word. ActiveDocument( ) ;
Для Каждого ТипОбъекта Из ОбъектыКонфы Цикл
Состояние( ТипОбъекта. Значение) ;
Если Метаданные[ТипОбъекта. Ключ]. Количество( ) > 0 Тогда
Документ. Paragraphs. Add( ) ;
Номер = Документ. Paragraphs. Count( ) ;
Документ. Paragraphs( Номер- 1 ) . Range( ) . I_nsertAfter( ТипОбъекта. Значение) ;
Документ. Paragraphs( Номер) . Range( ) . Style= "Заголовок 1" ;
Для каждого Объект Из Метаданные[ТипОбъекта. Ключ] Цикл
Документ. Paragraphs. Add( ) ;
Номер = Документ. Paragraphs. Count( ) ;
Документ. Paragraphs( Номер- 1 ) . Range( ) . I_nsertAfter( Объект. Синоним) ;
Документ. Paragraphs( Номер) . Range( ) . Style= "Заголовок 2" ;
Для каждого Параметр Из СтруктКонфы Цикл
Попытка
Количество = Объект[Параметр. Ключ]. Количество( ) ;
Исключение
Продолжить;
КонецПопытки ;
Если Количество > 0 Тогда
Документ. Paragraphs. Add( ) ;
Номер = Документ. Paragraphs. Count( ) ;
Документ. Paragraphs( Номер- 1 ) . Range( ) . I_nsertAfter( Параметр. Значение + " (" + Количество + ")" ) ;
Документ. Paragraphs( Номер) . Range( ) . Style= "Заголовок 3" ;
Документ. Paragraphs. Add( ) ;
Номер= Документ. Paragraphs. Count( ) ;
Документ. Tables. Add( Документ. Paragraphs( Номер) . Range( ) , Количество+ 1 , 4 ) ;
Счетчик = 1 ;
Таблица = Документ. Tables( Документ. Tables. Count( ) ) ;
Таблица. Cell( Счетчик, 1 ) . Range( ) . I_nsertAfter( "Имя" ) ;
Таблица. Cell( Счетчик, 2 ) . Range( ) . I_nsertAfter( "Синоним" ) ;
Таблица. Cell( Счетчик, 3 ) . Range( ) . I_nsertAfter( "Тип" ) ;
Таблица. Cell( Счетчик, 4 ) . Range( ) . I_nsertAfter( "Комментарий" ) ;
Документ. Range( Таблица. Cell( Счетчик, 1 ) . Range. Start, Таблица. Cell( Счетчик, 4 ) . Range. End) . Font. Bold = Истина ;
Для каждого Значение Из Объект[Параметр. Ключ] Цикл
Счетчик = Счетчик + 1 ;
Попытка
Таблица. Cell( Счетчик, 1 ) . Range( ) . I_nsertAfter( Значение. Имя) ;
Исключение
КонецПопытки ;
Попытка
Таблица. Cell( Счетчик, 2 ) . Range( ) . I_nsertAfter( Значение. Синоним) ;
Исключение
КонецПопытки ;
Попытка
СтрокаТипов = "" ;
Для каждого Тип Из Значение. Тип. Типы( ) Цикл
СтрокаТипов = СтрокаТипов + " " + Строка( Тип) ;
КонецЦикла ;
Таблица. Cell( Счетчик, 3 ) . Range( ) . I_nsertAfter( СтрокаТипов) ;
Исключение
КонецПопытки ;
Попытка
Таблица. Cell( Счетчик, 4 ) . Range( ) . I_nsertAfter( Значение. Комментарий) ;
Исключение
КонецПопытки ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Word. Visible = Истина ;
Word. Activate( ) ;
Word = Неопределено ;
КонецПроцедуры
Процедура ВыгрузитьВExcel()
Попытка
Excel = Новый COMОбъект( "Excel.Application" ) ;
Исключение
Сообщить( "Не удалось открыть Excel" ) ;
Возврат ;
КонецПопытки ;
Excel. Application. Workbooks. Add( 1 ) ;
Лист = Excel. ActiveSheet;
Лист. Name = "Данные" ;
НомерСтроки = 0 ;
Для Каждого ТипОбъекта Из ОбъектыКонфы Цикл
Состояние( ТипОбъекта. Значение) ;
Если Метаданные[ТипОбъекта. Ключ]. Количество( ) > 0 Тогда
НомерСтроки = НомерСтроки + 1 ;
Лист. Cells( НомерСтроки, 1 ) . Value = ТипОбъекта. Значение;
Лист. Cells( НомерСтроки, 1 ) . Font. Size = 16 ;
Лист. Cells( НомерСтроки, 1 ) . Font. ColorIndex = 3 ;
Для каждого Объект Из Метаданные[ТипОбъекта. Ключ] Цикл
НомерСтроки = НомерСтроки + 1 ;
Лист. Cells( НомерСтроки, 1 ) . Value = Объект. Синоним;
Лист. Cells( НомерСтроки, 1 ) . I_nsertIndent( 2 ) ;
Лист. Cells( НомерСтроки, 1 ) . Font. Size = 12 ;
Лист. Cells( НомерСтроки, 1 ) . Font. ColorIndex = 5 ;
Для каждого Параметр Из СтруктКонфы Цикл
Попытка
Количество = Объект[Параметр. Ключ]. Количество( ) ;
Исключение
Продолжить;
КонецПопытки ;
Если Количество > 0 Тогда
НомерСтроки = НомерСтроки + 1 ;
Лист. Cells( НомерСтроки, 1 ) . Value = Параметр. Значение + " (" + Количество + ")" ;
Лист. Cells( НомерСтроки, 1 ) . I_nsertIndent( 4 ) ;
Лист. Cells( НомерСтроки, 1 ) . Font. Bold = Истина ;
Лист. Cells( НомерСтроки, 1 ) . Font. ColorIndex = 16 ;
НомерСтроки = НомерСтроки + 1 ;
Лист. Cells( НомерСтроки, 1 ) . Value = "Имя" ;
Лист. Cells( НомерСтроки, 2 ) . Value = "Синоним" ;
Лист. Cells( НомерСтроки, 3 ) . Value = "Тип" ;
Лист. Cells( НомерСтроки, 4 ) . Value = "Комментарий" ;
Для Ном = 1 По 4 Цикл
Лист. Cells( НомерСтроки, Ном) . ColumnWidth = 20 ;
Лист. Cells( НомерСтроки, Ном) . Font. Bold = Истина ;
Лист. Cells( НомерСтроки, Ном) . Borders( 5 ) . LineStyle = - 4142 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 7 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 8 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 9 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 10 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Interior. ColorIndex = 34 ;
КонецЦикла ;
Для каждого Значение Из Объект[Параметр. Ключ] Цикл
НомерСтроки = НомерСтроки + 1 ;
Попытка
Лист. Cells( НомерСтроки, 1 ) . Value = Значение. Имя;
Исключение
КонецПопытки ;
Попытка
Лист. Cells( НомерСтроки, 2 ) . Value = Значение. Синоним;
Исключение
КонецПопытки ;
Попытка
СтрокаТипов = "" ;
Для каждого Тип Из Значение. Тип. Типы( ) Цикл
СтрокаТипов = СтрокаТипов + " " + Строка( Тип) ;
КонецЦикла ;
Лист. Cells( НомерСтроки, 3 ) . Value = СтрокаТипов;
Исключение
КонецПопытки ;
Попытка
Лист. Cells( НомерСтроки, 4 ) . Value = Значение. Комментарий;
Исключение
КонецПопытки ;
Для Ном = 1 По 4 Цикл
Лист. Cells( НомерСтроки, Ном) . Borders( 5 ) . LineStyle = - 4142 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 7 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 8 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 9 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 10 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . VerticalAlignment = - 4160 ;
Лист. Cells( НомерСтроки, Ном) . WrapText = Истина ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Excel. Visible = Истина ;
Excel = Неопределено ;
КонецПроцедуры
Процедура Сформировать()
ОбъектыКонфы = Новый Структура( ) ;
ОбъектыКонфы. Вставить( "ОбщиеМодули" , "Общие модули" ) ;
ОбъектыКонфы. Вставить( "ОбщиеФормы" , "Общие формы" ) ;
ОбъектыКонфы. Вставить( "ОбщиеМакеты" , "Общие макеты" ) ;
ОбъектыКонфы. Вставить( "ОбщиеКартинки" , "Общие картинки" ) ;
ОбъектыКонфы. Вставить( "Роли" , "Роли" ) ;
ОбъектыКонфы. Вставить( "Интерфейсы" , "Интерфейсы" ) ;
ОбъектыКонфы. Вставить( "Стили" , "Стили" ) ;
ОбъектыКонфы. Вставить( "Языки" , "Языки" ) ;
ОбъектыКонфы. Вставить( "ПланыОбмена" , "Планы обмена" ) ;
ОбъектыКонфы. Вставить( "Константы" , "Константы" ) ;
ОбъектыКонфы. Вставить( "КритерииОтбора" , "Критерии отбора" ) ;
ОбъектыКонфы. Вставить( "Справочники" , "Справочники" ) ;
ОбъектыКонфы. Вставить( "Документы" , "Документы" ) ;
ОбъектыКонфы. Вставить( "ЖурналыДокументов" , "Журналы документов" ) ;
ОбъектыКонфы. Вставить( "Перечисления" , "Перечисления" ) ;
ОбъектыКонфы. Вставить( "Отчеты" , "Отчеты" ) ;
ОбъектыКонфы. Вставить( "Обработки" , "Обработки" ) ;
ОбъектыКонфы. Вставить( "ПланыВидовХарактеристик" , "Планы видов характеристик" ) ;
ОбъектыКонфы. Вставить( "ПланыСчетов" , "Планы счетов" ) ;
ОбъектыКонфы. Вставить( "ПланыВидовРасчета" , "Планы видов расчета" ) ;
ОбъектыКонфы. Вставить( "РегистрыСведений" , "Регистры сведений" ) ;
ОбъектыКонфы. Вставить( "РегистрыБухгалтерии" , "Регистры бухгалтерии" ) ;
ОбъектыКонфы. Вставить( "РегистрыРасчета" , "Регистры расчета" ) ;
СтруктКонфы = Новый Структура( ) ;
СтруктКонфы. Вставить( "Измерения" , "Измерения" ) ;
СтруктКонфы. Вставить( "Ресурсы" , "Ресурсы" ) ;
СтруктКонфы. Вставить( "Реквизиты" , "Реквизиты" ) ;
СтруктКонфы. Вставить( "Формы" , "Формы" ) ;
СтруктКонфы. Вставить( "Макеты" , "Макеты" ) ;
СтруктКонфы. Вставить( "Графы" , "Графы" ) ;
СтруктКонфы. Вставить( "ТабличныеЧасти" , "Табличные части" ) ;
СтруктКонфы. Вставить( "Значения" , "Значения" ) ;
ВыгрузитьВWord( ) ;
ВыгрузитьВExcel( ) ;
КонецПроцедуры
Код 1C v 7.x
Процедура Справочник()
Ворд= СоздатьОбъект( "Word.Application" ) ;
Ворд. DisplayAlerts= 0 ;
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Код" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= ? ( Метаданные. Справочник( СокрЛП( Имя) ) . ТипКода= "Текстовый" , "Строка" , "Число" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип+ " (" + СокрЛП( Метаданные. Справочник( СокрЛП( Имя) ) . ДлинаКода) + ")" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Наименование" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Строка (" + СокрЛП( Метаданные. Справочник( СокрЛП( Имя) ) . ДлинаНаименования) + ")" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "" ) ;
Для Сч= 1 По Метаданные. Справочник( СокрЛП( Имя) ) . Реквизит( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Реквизит= Метаданные. Справочник( СокрЛП( Имя) ) . Реквизит( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Предупреждение( "Готово" , 5 ) ;
КонецПроцедуры
Процедура Документ()
Ворд= СоздатьОбъект( "Word.Application" ) ;
Ворд. DisplayAlerts= 0 ;
Для Сч= 1 По Метаданные. Документ( СокрЛП( Имя) ) . РеквизитШапки( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Шапка" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. Документ( СокрЛП( Имя) ) . РеквизитШапки( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Для Сч= 1 По Метаданные. Документ( СокрЛП( Имя) ) . РеквизитТабличнойЧасти( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Таб. часть" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. Документ( СокрЛП( Имя) ) . РеквизитТабличнойЧасти( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Предупреждение( "Готово" , 5 ) ;
КонецПроцедуры
Процедура Общие()
Ворд= СоздатьОбъект( "Word.Application" ) ;
Ворд. DisplayAlerts= 0 ;
Для Сч= 1 По Метаданные. ОбщийРеквизитДокумента( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Шапка" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. ОбщийРеквизитДокумента( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Предупреждение( "Готово" , 5 ) ;
КонецПроцедуры
Процедура СтруктураРегистра()
Ворд= СоздатьОбъект( "Word.Application" ) ;
Ворд. DisplayAlerts= 0 ;
Для Сч= 1 По Метаданные. Регистр( СокрЛП( Имя) ) . Измерение( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Измерение" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. Регистр( СокрЛП( Имя) ) . Измерение( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Для Сч= 1 По Метаданные. Регистр( СокрЛП( Имя) ) . Ресурс( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Ресурс" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. Регистр( СокрЛП( Имя) ) . Ресурс( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Для Сч= 1 По Метаданные. Регистр( СокрЛП( Имя) ) . Реквизит( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Реквизит" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. Регистр( СокрЛП( Имя) ) . Реквизит( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Предупреждение( "Готово" , 5 ) ;
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Есть ли у текущего элемента подчиненные Код 1C v 8.х Выборка = Справочники. Номенклатура. Выбрать( , Владелец) ;
Если Выборка. Следующий( ) = Истина Тогда
КонецЕсли ;
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
| ЕдиницыИзмерения.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
|ГДЕ
| ЕдиницыИзмерения.Владелец = &Владелец" ;
Запрос. УстановитьПараметр( "Владелец" , Владелец) ;
Если НЕ Запрос. Выполнить( ) . Пустой( ) Тогда
КонецЕсли ;
Код 1C v 7.x Спр=СоздатьОбъект("Справочник.Контрагенты");
Попытка
дог=СоздатьОбъект("Справочник.Договоры");
исключение
Предупреждение("В конфигурации нет справочника ДОГОВОРЫ");
возврат;
конецПопытки;
Спр.ВыбратьЭлементы();//перебираем справочник-владелец
Пока спр.ПолучитьЭлемент()=1 Цикл
Если спр.ЭтоГруппа()=1 Тогда
продолжить;//группы не имеют подчиненных элементов
КонецЕсли;
Сообщить("Контрагент "+спр.Наименование+ " его договоры:");
дог.ИспользоватьВладельца(Спр.ТекущийЭлемент());//будем перебирать только
//подчиненные владельцу
дог.ВыбратьЭлементы(); //перебираем только подчиненные конкретному владельцу
Пока дог.получитьЭлемент()=1 Цикл
сообщить("----------"+дог.наименование);
КонецЦикла;
КонецЦикла;
Категория:
Справочники Создать всем подчиненный элемент справочника Код 1C v 7.x //проуедура всем контрагентам мозжает подчиненный докогвор "Дополнительный"
Спр=СоздатьОбъект("Справочник.Контрагенты");
Попытка
дог=СоздатьОбъект("Справочник.Договоры");
исключение
Предупреждение("В конфигурации нет справочника ДОГОВОРЫ");
возврат;
конецПопытки;
Спр.ВыбратьЭлементы();//перебираем справочник-владелец
Пока спр.ПолучитьЭлемент()=1 Цикл
Если спр.ЭтоГруппа()=1 Тогда
продолжить;//группы не могут имет подчиненных элементов
КонецЕсли;
дог.ИспользоватьВладельца(спр.ТекущийЭлемент());
дог.Новый();
Дог.наименование="Дополнительный";
дог.записать();//это часто забывают написать
конецЦикла;
Категория:
Справочники Перебрать, выбрать элементы подчиненного справочника Перебор элементов справочника принадлежащих элементу другого справочника, т.е когда один справочник подчинен другому справочнику.
Код 1C v 8.х
Выборка = Справочники. КонтактныеЛица. Выбрать( , Контрагент) ;
Пока Выборка. Следующий( ) Цикл
ОчереднойПодчиненый = Выборка. Ссылка;
КонецЦикла ;
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| КонтактныеЛица.Ссылка
|ИЗ
| Справочник.КонтактныеЛица КАК КонтактныеЛица
|ГДЕ
| КонтактныеЛица.Владелец = &Владелец" ;
Запрос. УстановитьПараметр( "Владелец" , Контрагент) ;
Результат = Запрос. Выполнить( ) ;
Выборка = Результат. Выбрать( ) ;
Пока Выборка. Следующий( ) Цикл
ОчереднойПодчиненый = Выборка. Ссылка;
КонецЦикла ;
Код 1C v 7.x //При работе с подчиненным справочником (например, при переборе или поиске элементов)
//требуется указать, для какого конкретно элемента-владельца получать подчиненные элементы.
//Для этого предназначена процедура ИспользоватьВладельца(ОбъектВладелец)
//агрегатного типа данных Справочник.
// Пример 1
спр=СоздатьОбъект("Справочник.Модели");
спрМарка=СоздатьОбъект("Справочник.Марки");
спрМарка.НайтиПоНаименованию("BMW");
спр.ИспользоватьВладельца(спрМарка.ТекущийЭлемент());
спр.ВыбратьЭлементы();
Пока спр.ПолучитьЭлемент()=1 Цикл
Сообщение(спр.ТекущийЭлемент().Наименование);
КонецЦикла;
// Пример 2
Спр=СоздатьОбъект("Справочник.Контрагенты");
Попытка
дог=СоздатьОбъект("Справочник.Договоры");
исключение
Предупреждение("В конфигурации нет справочника ДОГОВОРЫ");
возврат;
конецПопытки;
Спр.ВыбратьЭлементы();//перебираем справочник-владелец
Пока спр.ПолучитьЭлемент()=1 Цикл
Если спр.ЭтоГруппа()=1 Тогда
продолжить;//группы не имеют подчиненных элементов
КонецЕсли;
Сообщить("Контрагент "+спр.Наименование+ " его договоры:");
дог.ИспользоватьВладельца(Спр.ТекущийЭлемент());//будем перебирать только
//подчиненные владельцу
дог.ВыбратьЭлементы(); //перебираем только подчиненные конкретному владельцу
Пока дог.получитьЭлемент()=1 Цикл
сообщить("----------"+дог.наименование);
КонецЦикла;
КонецЦикла;
Категория:
Справочники