Функции и процедуры 1СВ этой статье описываются полезные функции и процедуры, помогающие эффективно работать с различными типами данных в системе "1С:Предприятие 7.7". //функция проверяет, является ли переданный в функцию Символ числом Функция ЭтоЧисло(Символ) Экспорт Если (КодСимв(Символ)>=48) И (КодСимв(Символ)<=57) Тогда Возврат(1); Иначе Возврат(0); КонецЕсли; КонецФункции //функция возвращает копейки Функция гКопейки(Значение) Экспорт Грн=Цел(Значение); Коп=Значение-Грн; Возврат(Коп*100); КонецФункции //функция возвращает сумму без скидки Функция гСкидка(Сумма,Скидка) Экспорт Возврат Сумма*(1-Скидка/100); КонецФункции //функция устанавливает новое значение реквизита документа или справочника и задаёт вопрос, если новое значение не соответствует предыдущему Функция гЗначение(Ко,Атрибут,Значение) Экспорт Знач1=Ко.ПолучитьАтрибут(Атрибут); Знач2=Значение; //проверка Если Не(ТипЗначенияСтр(Знач1)=ТипЗначенияСтр(Знач2)) Тогда //несоответствие типов Возврат(0); ИначеЕсли Не(ТипЗначенияСтр(Знач2)="Число") И (ПустоеЗначение(Знач2)=1) Тогда //пустое новое значение Возврат(0); КонецЕсли; //реквизит Если Метаданные.Документ(Ко.Вид()).Выбран()=1 Тогда //документ Если Метаданные.Документ(Ко.Вид()).РеквизитШапки(Атрибут).Выбран()=1 Тогда Ж=Метаданные.Документ(Ко.Вид()).РеквизитШапки(Атрибут); Имя=Ж.Представление(); ИначеЕсли Метаданные.Документ(Ко.Вид()).РеквизитТабличнойЧасти(Атрибут).Выбран()=1 Тогда Ж=Метаданные.Документ(Ко.Вид()).РеквизитТабличнойЧасти(Атрибут); Имя=Ж.Представление()+" (строка "+Ко.НомерСтроки+")"; Иначе Ж=Метаданные.ОбщийРеквизитДокумента(Атрибут); Имя=Ж.Представление(); КонецЕсли; ИначеЕсли Метаданные.Справочник(Ко.Вид()).Выбран()=1 Тогда //справочник Ж=Метаданные.Справочник(Ко.Вид()).Реквизит(Атрибут); Имя=Ж.Представление(); Если ПустаяСтрока(Имя)=1 Тогда Имя=Атрибут; КонецЕсли; КонецЕсли; //форматирование Если ТипЗначенияСтр(Знач2)="Строка" Тогда Знач1=СокрЛП(Знач1); Знач2=СокрЛП(Знач2); ИначеЕсли ТипЗначенияСтр(Знач2)="Число" Тогда Знач2=Окр(Знач2,Ж.Точность); КонецЕсли; //проверка Если Знач1=Знач2 Тогда Возврат(0); КонецЕсли; //установка значения Если ПустоеЗначение(Знач1)=0 Тогда Текст= "Атрибут: "+Имя+" | |Старое значение: "+СимволТабуляции+Знач1+" |Новое значение: "+СимволТабуляции+Знач2+" | |Установить новое значение?"; Если Вопрос(Текст,"Да+Нет")="Нет" Тогда Возврат(0) КонецЕсли; КонецЕсли; //значение Ко.УстановитьАтрибут(Атрибут,Знач2); Возврат(1); КонецФункции //форматирование числа Функция гЧисло(Значение,Знаки=2) Экспорт Ответ=Формат(Значение,"Ч18."+Знаки); Возврат СокрЛП(Ответ); КонецФункции //функция убирает лишние пробелы Функция гСжатьПробелы(аТекст) Экспорт Текст=СокрЛП(аТекст); //пробелы Замена=Формат(" ","С5"); Для й=1 По 4 Цикл Знак=Сред(Замена,й); Текст=СтрЗаменить(Текст,Знак," "); КонецЦикла; //возврат Возврат СокрЛП(Текст); КонецФункции //функция возвращает переданную строку, в которой первая буква устанавливается в верхнем или в нижнем регистре Функция гБуква(Текст,ФлагНрег=0) Экспорт Буква=Лев(Текст,1); Если ФлагНрег=0 Тогда Буква=ВРег(Буква); Иначе Буква=НРег(Буква); КонецЕсли; Возврат(Буква+Сред(Текст,2)); КонецФункции /функция возвращает представление переданного документа Функция гПредставлениеДокумента(Д) Экспорт Возврат Д.ПредставлениеВида()+" "+СокрЛП(Д.НомерДок)+" ("+Д.ДатаДок+")"; КонецФункции //процедура выдаёт сообщение при проведении документа Процедура гСообщить(Ко,Текст,НомерСтроки=0,Символ="!") Экспорт //сигнал Если Ко.Ошибка=0 Тогда Сигнал(); КонецЕсли; //документ Документ=""+Ко.ДатаДок+" "+Ко.ПредставлениеВида()+" "+СокрЛП(Ко.НомерДок); //номер строки Если НомерСтроки>0 Тогда Документ=Документ+" (строка "+НомерСтроки+")"; КонецЕсли; //сообщение Сообщить(Документ+": "+Текст,Символ); КонецПроцедуры //процедура выполняется при добавлении нового значения в интерактивный список значений Процедура сзДобавить(Список,Тип,Вид,Длина,Точность,Подсказка) Экспорт //тип Если (Тип="Справочник") Или (Тип="Документ") Тогда Тип=Тип+"."+Вид; КонецЕсли; //значение Если Список.ТекущаяСтрока()=0 Тогда Значение=""; Иначе Значение=Список.ПолучитьЗначение(Список.ТекущаяСтрока()); КонецЕсли; //выбор Если ВвестиЗначение(Значение,Подсказка,Тип,Длина,Точность)=1 Тогда Список.ДобавитьЗначение(Значение); КонецЕсли; КонецПроцедуры //процедура выполняется для изменения значения интерактивного списка значений Процедура сзИзменить(Список) Экспорт Позиция=Список.ТекущаяСтрока(); Если Позиция=0 Тогда Возврат; КонецЕсли; // Значение=Список.ПолучитьЗначение(Список.ТекущаяСтрока()); Тип=ТипЗначенияСтр(Значение); Если (Тип="Справочник") Или (Тип="Документ") Тогда Тип=Тип+"."+Значение.Вид(); Подсказка=Значение.Вид(); Иначе Подсказка=Тип; КонецЕсли; Если ВвестиЗначение(Значение,Подсказка,Тип)=1 Тогда Список.УстановитьЗначение(Позиция,Значение); КонецЕсли; КонецПроцедуры //процедура выполняется при удалении значения из интерактивного списка значений Процедура сзУдалить(Список) Экспорт Если Список.ТекущаяСтрока()>0 Тогда Список.УдалитьЗначение(Список.ТекущаяСтрока()); КонецЕсли; КонецПроцедуры //процедура изменяет позицию значения интерактивного списка значений Процедура сзСдвинуть(Список,Количество) Экспорт Если (Количество>0) И (Список.ТекущаяСтрока()=Список.РазмерСписка()) Тогда Количество=1-Список.РазмерСписка(); ИначеЕсли (Количество<0) И (Список.ТекущаяСтрока()=1) Тогда Количество=Список.РазмерСписка()-1; КонецЕсли; Список.СдвинутьЗначение(Количество,Список.ТекущаяСтрока()); КонецПроцедуры //функция проверяет наличие в списке значений с пометками хотя бы одного помеченного значения Функция сзПометка(Список) Экспорт Для i=1 По Список.РазмерСписка() Цикл Если Список.Пометка(i)=1 Тогда Возврат(1); КонецЕсли; КонецЦикла; //нет пометок Возврат(0); КонецФункции //функция помечает или снимает пометку для всех значений списка Процедура сзПометить(Список,Флаг) Экспорт Для й=1 По Список.РазмерСписка() Цикл Список.Пометка(й,Флаг); КонецЦикла; КонецПроцедуры //процедура оставляет в списке значений заданное количество значений Процедура сзОбрезать(Список,Размер) Экспорт Если Список.РазмерСписка()>Размер Тогда Количество=Список.РазмерСписка()-Размер; Список.УдалитьЗначение(Размер+1,Количество); КонецЕсли; КонецПроцедуры //функция выгружает значения колонки таблицы значений в список значений Функция сзКолонка(М,Колонка) Экспорт Список=СоздатьОбъект("СписокЗначений"); // В=СоздатьОбъект("ТаблицаЗначений"); М.Выгрузить(В,,,Колонка); В.Свернуть(Колонка,); В.Выгрузить(Список,,,Колонка); Возврат(Список); КонецФункции //процедура преобразует строку со значениями в список значений Процедура сзПарсить(Список,Текст) Экспорт Если ПустаяСтрока(Текст)=0 Тогда Если Найти(Текст,"=")=0 Тогда //делитель - Запятая Значение=СтрЗаменить(СокрЛП(Текст),",",Симв(34)+","+Симв(34)); Значение=Симв(34)+Значение+Симв(34); Список.ИзСтрокиСРазделителями(Значение); Иначе //делитель - Точка с запятой Текст=СтрЗаменить(Текст,";",РазделительСтрок); Для й=1 По Текст.КоличествоСтрок() Цикл Стр=Текст.ПолучитьСтроку(й); Если ПустаяСтрока(Стр)=0 Тогда Позиция=Найти(Стр,"="); Если Позиция>0 Тогда Идентификатор=Лев(Стр,Позиция-1); Значение=Сред(Стр,Позиция+1); Список.Установить(СокрЛП(Идентификатор),СокрЛП(Значение)); Иначе Список.ДобавитьЗначение(СокрЛП(Стр)); КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; КонецПроцедуры //процедура позиционирует строку списка значений на заданном значении Процедура сзУстановить(Список,Значение) Экспорт Позиция=Список.НайтиЗначение(Значение); Если Позиция>0 Тогда Список.ТекущаяСтрока(Позиция); КонецЕсли; КонецПроцедуры //процедура сдвигает строку в таблице значений; //если сдвигается последняя строка вниз, то строка становится первой; //если сдвигается первая строка вверх, то строка перемещается в конец таблицы значений Процедура тзСдвинуть(М,Количество) Экспорт Если (Количество>0) И (М.ТекущаяСтрока()=М.КоличествоСтрок()) Тогда Количество=1-М.КоличествоСтрок(); ИначеЕсли (Количество<0) И (М.ТекущаяСтрока()=1) Тогда Количество=М.КоличествоСтрок()-1; КонецЕсли; М.СдвинутьСтроку(Количество,М.ТекущаяСтрока())()); КонецПроцедуры //процедура обнуляет значения таблицы значений вниз от заданной строки и вправо от заданной колонки Процедура тзОбнулить(М,НомерСтр,НомерКол) Экспорт Для i=НомерСтр По М.КоличествоСтрок() Цикл Для j=НомерКол По М.КоличествоКолонок() Цикл М.УстановитьЗначение(i,j,0); КонецЦикла; КонецЦикла; КонецПроцедуры //процедура удаляет строку в интерактивной таблице значений Процедура тзУдалитьСтроку(М) Экспорт //запоминание текущей строки ТекСтрока=М.ТекущаяСтрока()-1; //удаление М.УдалитьСтроку(); //позиционирование Если М.КоличествоСтрок()>0 Тогда ТекСтрока=Мин(ТекСтрока,М.КоличествоСтрок()); М.ТекущаяСтрока(ТекСтрока); КонецЕсли; КонецПроцедуры //процедура находит документ с заданным номером в таблице значений с документами Процедура гЖурнал_Найти(М) Экспорт НомерДок=0; Если ВвестиЧисло(НомерДок,"Номер документа",5,0)=1 Тогда //поиск по номеру в выборке Если М.НайтиЗначение(НомерДок,,"Номер")=0 Тогда Предупреждение("Документ № "+НомерДок+" не найден"); Возврат; КонецЕсли; //поиск документа Список=СоздатьОбъект("СписокЗначений"); М.ВыбратьСтроки(); Пока М.ПолучитьСтроку()=1 Цикл Если М.Номер=НомерДок Тогда Список.ДобавитьЗначение(М.ТекущийДокумент); КонецЕсли; КонецЦикла; //выбор Значение=""; Если Список.РазмерСписка()=1 Тогда Значение=Список.ПолучитьЗначение(1); ИначеЕсли Список.ВыбратьЗначение(Значение,"Выбор документа")=0 Тогда Возврат; КонецЕсли; //позиционирование НомерСтр=0; М.НайтиЗначение(Значение,НомерСтр,"ТекущийДокумент"); М.ТекущаяСтрока(НомерСтр); КонецЕсли; КонецПроцедуры //установление автоширины колонок таблицы Процедура гАвтоШиринаКолонок(Таб,НачКол,НачСтр) Экспорт Для НомерКол=НачКол По Таб.ШиринаТаблицы() Цикл МаксШирина=0; Для НомерСтр=НачСтр По Таб.ВысотаТаблицы() Цикл ТекШирина=СтрДлина(Таб.Область(НомерСтр,НомерКол).Текст); МаксШирина=Макс(МаксШирина,ТекШирина); КонецЦикла; Таб.Область(,НомерКол).ШиринаСтолбца(МаксШирина+2); КонецЦикла; КонецПроцедуры //функция проверяет, равен ли месяцу интервал между заданными датами Функция ЭтоМесяц(ДатаН,ДатаК) Экспорт Если Не(ДатаН=НачМесяца(ДатаН)) Тогда Возврат(0); ИначеЕсли Не(ДатаК=КонМесяца(ДатаК)) Тогда Возврат(0); ИначеЕсли ДатаН=НачМесяца(ДатаК) Тогда Возврат(1); Иначе Возврат(0); КонецЕсли; КонецФункции //функция возвращает количество полных месяцев между датами Функция гМесяцев(ДатаН,ДатаК) Экспорт Если ДатаН<ДатаК Тогда ТекДата=НачМесяца(ДатаН); Значение=1; Пока ТекДата<НачМесяца(ДатаК) Цикл ТекДата=ДобавитьМесяц(ТекДата,1); Значение=Значение+1; КонецЦикла; Возврат(Значение); Иначе Возврат(0); КонецЕсли; КонецФункции //функция определяет порядковый номер месяца в квартале Функция гМесяцКвартала(ДатаДок) Экспорт НачМесяц=ДатаМесяц(НачКвартала(ДатаДок)); КонМесяц=ДатаМесяц(ДатаДок); Возврат(КонМесяц-НачМесяц+1); КонецФункции //функция определяет порядковый номер квартала по дате Функция гДатаКвартал(аДата) Экспорт Возврат ДатаМесяц(КонКвартала(аДата))/3; КонецФункции //ф//функция возвращает дату, находящуюся на определённом интервале дней от заданной даты, без учёта выходных; //например, используется для определения конечной даты действия счёта-фактуры Функция гСрокДействия(ДатаДок,Период,Вид="Основной") Экспорт К=СоздатьОбъект("Календарь."+Вид); К.УчитыватьПраздники(1); Если К.Автозаполнение(ДатаДок,ДобавитьМесяц(ДатаДок+Период,1))=1 Тогда Возврат К.ПолучитьДату(ДатаДок,Период); КонецЕсли; КонецФункции //функция определяет количество рабочих дней в интервале дат Функция гРабочиеДни(ДатаН,ДатаК,Вид="Основной") Экспорт К=СоздатьОбъект("Календарь."+Вид); К.УчитыватьПраздники(1); Если К.Автозаполнение(ДатаН,ДатаК)=1 Тогда Возврат К.Дней(ДатаН,ДатаК); КонецЕсли; КонецФункции //функция определяет количество праздничных дней в интервале дат Функция гПраздники(ДатаН,ДатаК) Экспорт Кол=0; // П=СоздатьОбъект("Праздники"); П.ВыбратьДаты(ДатаН,ДатаК); Пока П.СледующаяДата()=1 Цикл Если НомерДняНедели(П.Дата)<6 Тогда Кол=Кол+1; КонецЕсли; КонецЦикла; // Возврат(Кол); КонецФункции //функция возвращает элемент заданного справочника по значению реквизита "Счет" Функция сНайтиПоСчету(Счет,Справочник,Реквизит="Счет") Экспорт С=СоздатьОбъект("Справочник."+Справочник); Если С.НайтиПоРеквизиту(Реквизит,Счет,1)=1 Тогда Возврат С.ТекущийЭлемент(); Иначе Возврат ПолучитьПустоеЗначение("Справочник."+Справочник); КонецЕсли; КонецФункции //функция возвращает элемент заданного справочника по полному коду элемента Функция сНайтиПоКоду(Справочник,Код) Экспорт С=СоздатьОбъект("Справочник."+Справочник); Если С.НайтиПоКоду(Код,2)=1 Тогда Возврат С.ТекущийЭлемент(); Иначе Возврат ПолучитьПустоеЗначение("Справочник."+Справочник); КонецЕсли; КонецФункции //функция возвращает элемент заданного справочника по наименованию //если элемент отсутствует в справочнике, то создаётся новый Функция сНайтиПоНаименованию(Справочник,Наименование) Экспорт С=СоздатьОбъект("Справочник."+Справочник); Если С.НайтиПоНаименованию(Наименование,0,1)=0 Тогда С.Новый(); С.Наименование=Наименование; С.Записать(); Сообщить("Справочник "+Справочник+": Новый элемент "+Наименование); КонецЕсли; Возврат(С.ТекущийЭлемент()); КонецФункции //процедура удаляет заданный элемент справочника Процедура гЭлемент_Удалить(Элемент,Флаг) Экспорт С=СоздатьОбъект("Справочник."+Элемент.Вид()); С.НайтиЭлемент(Элемент); С.Удалить(Флаг); КонецПроцедуры //функция возвращает строку вида "Иванов И.И." из переданной в функцию строки вида "Иванов Иван Иванович" Функция гФио_Получить(Значение) Стр=гФорматС(Значение); Стр=СтрЗаменить(Стр," ",РазделительСтрок); Если СтрКоличествоСтрок(Стр)=1 Тогда Фио=СокрЛП(Стр); ИначеЕсли СтрКоличествоСтрок(Стр)=2 Тогда СтрФ=СтрПолучитьСтроку(Стр,1); СтрИ=СтрПолучитьСтроку(Стр,2); Фио=СокрЛП(СтрФ)+" "+Лев(СокрЛП(СтрИ),1)+"."; Иначе СтрО=СтрПолучитьСтроку(Стр,СтрКоличествоСтрок(Стр)); СтрИ=СтрПолучитьСтроку(Стр,СтрКоличествоСтрок(Стр-1)); СтрФ=""; Для й=1 По СтрКоличествоСтрок(Стр)-2 Цикл СтрФ=СтрФ+" "+СтрПолучитьСтроку(Стр,й); КонецЦикла; Фио=СокрЛП(СтрФ)+" "+Лев(СокрЛП(СтрИ),1)+"."+Лев(СокрЛП(СтрО),1)+"."; КонецЕсли; Возврат(Фио); КонецФункции //функция открывает подбор из справочника и предоставляет пользователю выбор из элементов фиксированной группы Функция сПодборРодитель(Ко,Родитель,Элемент,Заголовок="") Экспорт Ко.ОткрытьПодбор("Справочник."+Родитель.Вид(),"ДляВыбора",,0); Ко.КонтекстПодбора.ИспользоватьРодителя(Родитель,0); Ко.КонтекстПодбора.ИерархическийСписок(1,0); //текущий элемент Если Элемент.Выбран()=1 Тогда Ко.КонтекстПодбора.АктивизироватьОбъект(Элемент); КонецЕсли; //заголовок Если ПустаяСтрока(Заголовок)=0 Тогда Ко.КонтекстПодбора.Форма.Заголовок(Заголовок,0); КонецЕсли; //отмена стандартной обработки Возврат(0); КонецФункции //удаление ведущих нолей в номере документа Функция гНомерДок(Значение) Экспорт Текст=СокрЛП(Значение); Текст=СтрЗаменить(Текст," ",""); Текст=СтрЗаменить(Текст,"_","-"); Если Константа.ФлагНомерОсн=0 Тогда Возврат(Текст); ИначеЕсли Текст="0" Тогда Возврат(Текст); КонецЕсли; //префикс Префикс=""; Для i=1 По СтрЧислоВхождений(Текст,"-") Цикл Позиция=Найти(Текст,"-"); Префикс=Префикс+Лев(Текст,Позиция); Текст=Сред(Текст,Позиция+1); КонецЦикла; //удаление нолей ФлагЧисло=0; Номер=""; Для i=1 По СтрДлина(Текст) Цикл Символ=Сред(Текст,i,1); Если ЭтоЧисло(Символ)=0 Тогда Номер=Номер+Символ; ИначеЕсли Не(Число(Символ)=0) Тогда Номер=Номер+Символ; ФлагЧисло=1; ИначеЕсли ФлагЧисло=1 Тогда Номер=Номер+Символ; КонецЕсли; КонецЦикла; // Возврат(Префикс+Номер); КонецФункции //функция возвращает числовой номер документа без префикса Функция гНомерБезПрефикса(Значение) Экспорт Номер=гНомерДок(Значение); Позиция=Найти(Значение,"-"); Номер=Сред(Номер,Позиция+1); Возврат(Номер); КонецФункции //функция создаёт таблицу значений документов заданного вида по одному клиенту и даёт выбрать один документ Функция гДокументКлиента(Значение,Клиент,ВидДокумента) Экспорт Если Клиент.Выбран()=0 Тогда Предупреждение("Не выбран Контрагент!"); Возврат(0); КонецЕсли; //таблица М=СоздатьОбъект("ТаблицаЗначений"); М.НоваяКолонка("Дата","Дата",,,,10); М.НоваяКолонка("Док","Строка",,,"Документ",50); М.НоваяКолонка("Сумма","Число",,,,18,"Ч015.2"); М.НоваяКолонка("Документ","Документ"); М.ВидимостьКолонки("Документ",0); //документы Д=СоздатьОбъект("Документ"); Д.ВыбратьПоЗначению(,,"Клиент",Клиент); Пока Д.ПолучитьДокумент()=1 Цикл Состояние(""+Д.ДатаДок); Если Не(Д.Вид()=ВидДокумента) Тогда Продолжить; КонецЕсли; //строка М.НоваяСтрока(); М.Документ=Д.ТекущийДокумент(); М.Дата=Д.ДатаДок; М.Док=Д.ПредставлениеВида()+" "+СокрЛП(Д.НомерДок); //сумма Ж=Метаданные.Документ(Д.Вид()); Если Ж.РеквизитТабличнойЧасти("ВалСумма").Выбран()=1 Тогда М.Сумма=Д.Итог("ВалСумма"); ИначеЕсли Ж.РеквизитТабличнойЧасти("СуммаС").Выбран()=1 Тогда М.Сумма=Д.Итог("СуммаС"); ИначеЕсли Ж.РеквизитТабличнойЧасти("Сумма").Выбран()=1 Тогда М.Сумма=Д.Итог("Сумма"); КонецЕсли; КонецЦикла; //проверка Если М.КоличествоСтрок()=0 Тогда Предупреждение("Документы не найдены!"); Возврат(0); КонецЕсли; //строка по умолчанию НомерСтр=0; Если М.НайтиЗначение(Значение,НомерСтр,"Документ")=0 Тогда НомерСтр=М.КоличествоСтрок(); КонецЕсли; //выбор Заголовок=Метаданные.Документ(ВидДокумента).Представление()+": "+Клиент.Наименование; Если М.ВыбратьСтроку(НомерСтр,Заголовок)=1 Тогда Значение=М.ПолучитьЗначение(НомерСтр,"Документ"); Возврат(1); Иначе Возврат(0); КонецЕсли; КонецФункции Процедура ОбработкаЯчейкиТаблицы(Значение,Флаг,Таблица,Адрес) Перем Ответ; Перем Ко; Если ПустоеЗначение(Значение)=1 Тогда Предупреждение("Невозможно обработать значение ячейки!"); ИначеЕсли ТипЗначенияСтр(Значение)="Документ" Тогда Если гПользователь.ФлагСписок=0 Тогда Флаг=1; Иначе А=СоздатьОбъект("СписокЗначений"); А.ДобавитьЗначение(0,"Открыть документ"); А.ДобавитьЗначение(1,"Открыть в журнале документов"); Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда Если Ответ=0 Тогда Флаг=1; Иначе Журнал=Метаданные.Документ(Значение.Вид()).Журнал.Идентификатор; ОткрытьФорму("Журнал."+Журнал+".Основная",Ко); Ко.АктивизироватьОбъект(Значение); КонецЕсли; КонецЕсли; КонецЕсли; ИначеЕсли ТипЗначенияСтр(Значение)="Справочник" Тогда Если гПользователь.ФлагСписок=0 Тогда Флаг=1; Иначе А=СоздатьОбъект("СписокЗначений"); А.ДобавитьЗначение(0,"Открыть элемент"); А.ДобавитьЗначение(1,"Открыть в списке справочника"); Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда Если Ответ=0 Тогда Флаг=1; Иначе Журнал=Метаданные.Справочник(Значение.Вид()).ОсновнаяФорма; ОткрытьФорму("Справочник."+Значение.Вид()+"."+Журнал,Ко); Ко.АктивизироватьОбъект(Значение); КонецЕсли; КонецЕсли; КонецЕсли; ИначеЕсли ТипЗначенияСтр(Значение)="СписокЗначений" Тогда //расшифровка - СписокЗначений Кнопка=Значение.Получить("Кнопка"); Если Число(Кнопка)=0 Тогда Значение.СортироватьПоПредставлению(); //обработка - Ячейка Представление=""; А=СоздатьОбъект("СписокЗначений"); Для i=1 По Значение.РазмерСписка() Цикл Отчет=Значение.ПолучитьЗначение(i,Представление); Если ПустаяСтрока(Отчет)=1 Тогда Продолжить; ИначеЕсли Лев(Представление,4)="Меню" Тогда //элемент контекстного меню в ячейке Позиция=Найти(Отчет,"|"); Если Позиция=0 Тогда Представление=Метаданные.Отчет(Отчет).Представление(); Иначе Добавка=Сред(Отчет,Позиция+1); Отчет=Лев(Отчет,Позиция-1); Представление=Метаданные.Отчет(Отчет).Представление()+": "+Добавка; КонецЕсли; А.ДобавитьЗначение(Отчет,Представление); КонецЕсли; КонецЦикла; //контекстное меню в ячейке Если А.РазмерСписка()>0 Тогда Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда Значение.Выгрузить(гПакет); гПакет.Установить("Таблица",""); ОткрытьФормуМодально("Отчет."+Ответ,1+гПользователь.ФлагОтчет); КонецЕсли; КонецЕсли; Иначе //обработка - Кнопка Значение.Выгрузить(гПакет); гПакет.Установить("Таблица",Таблица); Отчет=Значение.Получить("Отчет"); ОткрытьФормуМодально("Отчет."+Отчет,Кнопка); гПакет.Установить("Таблица",""); КонецЕсли; ИначеЕсли ТипЗначенияСтр(Значение)="Строка" Тогда Если ВРег(Лев(СокрЛП(Значение),6))="ССЫЛКА" Тогда СтрокаЗапуска=СокрЛП(Сред(Значение,7)); ЗапуститьПриложение(СтрокаЗапуска); Иначе Флаг=1; КонецЕсли; Иначе //расшифровка - Стандартная обработка ячейки Флаг=1; КонецЕсли; КонецПроцедуры //функция определяет сумму первого события за период по заданным остаткам на начало и конец периода Функция гПервоеСобытие(НачД,НачК,КонД,КонК) Экспорт //первое событие СуммаД=Макс(КонД-НачД,0); СуммаК=Макс(КонК-НачК,0); //сумма Возврат(СуммаД+СуммаК); КонецФункции РезюмеВ статье описаны функции и процедуры, используемые в программе "1С:Предприятие 7.7" для работы со справочниками, документами, списками значений, таблицами значений и с прочими агрегатными типами данных. Образцы практического применения описанных средств Вы сможете найти в статьях "Отчёты для 1С" и "Обработки для 1С".
- Дополнительная информация по теме кодирования в 1С:
-
- Смотрите также:
- Обработки для 1С
- Отчёты для 1С
- Скачать программы для 1С
- Как заработать в Интернете
|