Функции и процедуры 1С Предприятие 7.7

В этой статье описываются полезные функции и процедуры, помогающие эффективно работать с различными типами данных в системе "1С:Предприятие 7.7".

Обработка значений в 1С

//функция проверяет, является ли переданный в функцию Символ числом
Функция ЭтоЧисло(Символ) Экспорт
     Если (КодСимв(Символ)>=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);
КонецФункции

Форматирование данных в 1С

//форматирование числа
Функция гЧисло(Значение,Знаки=2) Экспорт
     Ответ=Формат(Значение,"Ч18."+Знаки);
     Возврат СокрЛП(Ответ);
КонецФункции

//функция убирает лишние пробелы
Функция гСжатьПробелы(аТекст) Экспорт
     Текст=СокрЛП(аТекст);
     //пробелы
     Замена=Формат(" ","С5");
     Для й=1 По 4 Цикл
          Знак=Сред(Замена,й);
          Текст=СтрЗаменить(Текст,Знак," ");
     КонецЦикла;
     //
     Возврат СокрЛП(Текст);
КонецФункции

//функция возвращает переданную строку, в которой первая буква устанавливается в верхнем или в нижнем регистре
Функция гБуква(Текст,ФлагНрег=0) Экспорт
     Буква=Лев(Текст,1);
     Если ФлагНрег=0 Тогда
          Буква=ВРег(Буква);
     Иначе
          Буква=НРег(Буква);
     КонецЕсли;
     Возврат(Буква+Сред(Текст,2));
КонецФункции

/функция возвращает представление переданного документа
Функция гПредставлениеДокумента(Д) Экспорт
     Возврат Д.ПредставлениеВида()+" "+СокрЛП(Д.НомерДок)+" ("+Д.ДатаДок+")";
КонецФункции

//процедура выдаёт сообщение при проведении документа
Процедура гСообщить(Ко,Текст,НомерСтроки=0,Символ="!") Экспорт
     //сигнал
     Если Ко.Ошибка=0 Тогда
          Сигнал();
     КонецЕсли;
     //документ
     Документ=""+Ко.ДатаДок+" "+Ко.ПредставлениеВида()+" "+СокрЛП(Ко.НомерДок);
     //номер строки
     Если НомерСтроки>0 Тогда
          Документ=Документ+" (строка "+НомерСтроки+")";
     КонецЕсли;
     //сообщение
     Сообщить(Документ+": "+Текст,Символ);
КонецПроцедуры

Список значений в 1С

//процедура выполняется при добавлении нового значения в интерактивный список значений
Процедура сзДобавить(Список,Тип,Вид,Длина,Точность,Подсказка) Экспорт
     //тип
     Если (Тип="Справочник") Или (Тип="Документ") Тогда
          Тип=Тип+"."+Вид;
     КонецЕсли;
     //значение
     Если Список.ТекущаяСтрока()=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 Тогда
          Список.ТекущаяСтрока(Позиция);
     КонецЕсли;
КонецПроцедуры

Таблица значений в 1С

//процедура сдвигает строку в таблице значений;
//если сдвигается последняя строка вниз, то строка становится первой;
//если сдвигается первая строка вверх, то строка перемещается в конец таблицы значений

Процедура      Количество=1-М.КоличествоСтрок();
     ИначеЕсли (Количество<0) И (М.ТекущаяСтрока()=1) Тогда
          Количество=М.КоличествоСтрок()-1;
     КонецЕсли;
     М.СдвинутьСтроку(Количество,М.ТекущаяСтрока())());
КонецПроцедуры

//процедура обнуляет значения таблицы значений вниз от заданной строки и вправо от заданной колонки
Процедура тзОбнулить(М,НомерСтр,НомерКол) Экспорт
     Для i=НомерСтр По М.КоличествоСтрок() Цикл
          Для j=НомерКол По М.КоличествоКолонок() Цикл
               М.УстановитьЗначение(i,j,0);
          КонецЦикла;
     КонецЦикла;
КонецПроцедуры

//процедура удаляет строку в интерактивной таблице значений> Процедура тзУдалитьСтроку(М) Экспорт
     //запоминание текущей строки
     ТекСтрока=М.ТекущаяСтрока()-1;
     //удаление
     М.УдалитьСтроку();
     //позиционирование
     Если М.КоличествоСтрок()>0 Тогда
          ТекСтрока=Мин(ТекСтрока,М.КоличествоСтрок());
          М.ТекущаяСтрока(ТекСтрока);
     КонецЕсли;
КонецПроцедуры

//процедура находит документ с заданным номером в таблице значений с документами
Процедура гЖурнал_Найти(М) Экспорт
     НомерДок=0;
     Если ВвестиЧисло(НомерДок,"Номер документа",5,0)=1 Тогда
          //поиск по номеру в выборке
          Если М.НайтиЗначение(НомерДок,,"Номер")=0 Тогда
               Предупреждение("Документ № "+НомерДок+" не найден");
               Возврат;
          КонецЕсли;
          //поиск документа
          Список=СоздатьОбъект("СписокЗначений");
          М.ВыбратьСтроки();
          Пока М.ПолучитьСтроку()=1 Цикл
               Если М.Номер=НомерДок Тогда
                    Список.ДобавитьЗначение(М.ТекущийДокумент);
               КонецЕсли;
          КонецЦикла;
          //выбор
          Значение="";
          Если Список.РазмерСписка()=1 Тогда
               Значение=Список.ПолучитьЗначение(1);
          ИначеЕсли Список.ВыбратьЗначение(Значение,"Выбор документа")=0 Тогда
               Возврат;
          КонецЕсли;
          //позиционирование
          НомерСтр=0;
          М.НайтиЗначение(Значение,НомерСтр,"ТекущийДокумент");
          М.ТекущаяСтрока(НомерСтр);
     КонецЕсли;
КонецПроцедуры

Таблица или печатная форма в 1С

//установление автоширины колонок таблицы
Процедура гАвтоШиринаКолонок(Таб,НачКол,НачСтр) Экспорт
     Для НомерКол=НачКол По Таб.ШиринаТаблицы() Цикл
          МаксШирина=0;
          Для НомерСтр=НачСтр По Таб.ВысотаТаблицы() Цикл
               ТекШирина=СтрДлина(Таб.Область(НомерСтр,НомерКол).Текст);
               МаксШирина=Макс(МаксШирина,ТекШирина);
          КонецЦикла;
          Таб.Область(,НомерКол).ШиринаСтолбца(МаксШирина+2);
     КонецЦикла;
КонецПроцедуры

Периоды и даты в 1С

//функция проверяет, равен ли месяцу интервал между заданными датами
Функция ЭтоМесяц(ДатаН,ДатаК) Экспорт
     Если Не(ДатаН=НачМесяца(ДатаН)) Тогда
          Возврат(0);
     ИначеЕсли Не(ДатаК=КонМесяца(ДатаК)) Тогда
          Возврат(0);
     ИначеЕсли ДатаН=НачМесяца(ДатаК) Тогда
          Возврат(1);
     Иначе
          Возврат(0);
     КонецЕсли;
КонецФункции

//функция возвращает количество полных месяцев между датами
Функция гМесяцев(ДатаН,ДатаК) Экспорт
     Если ДатаН<ДатаК Тогда
          ТекДата=НачМесяца(ДатаН);
          Значение=1;
          Пока ТекДата<НачМесяца(ДатаК) Цикл
               ТекДата=ДобавитьМесяц(ТекДата,1);
               Значение=Значение+1;
          КонецЦикла;
          Возврат(Значение);
     Иначе
          Возврат(0);
     КонецЕсли;
КонецФункции

//функция определяет порядковый номер месяца в квартале
Функция гМесяцКвартала(ДатаДок) Экспорт
     НачМесяц=ДатаМесяц(НачКвартала(ДатаДок));
     КонМесяц=ДатаМесяц(ДатаДок);
     Возврат(КонМесяц-НачМесяц+1);
КонецФункции

//функция определяет порядковый номер квартала по дате
Функция гДатаКвартал(аДата) Экспорт
     Возврат ДатаМесяц(КонКвартала(аДата))/3;
КонецФункции

Календари и праздники в 1С

//ф//функция возвращает дату, находящуюся на определённом интервале дней от заданной даты, без учёта выходных;
//например, используется для определения конечной даты действия счёта-фактуры
Функция an class="color-blue">гСрокДействия(ДатаДок,Период,Вид="Основной") Экспорт
     К=СоздатьОбъект("Календарь."+Вид);
     К.УчитыватьПраздники(1);
     Если К.Автозаполнение(ДатаДок,ДобавитьМесяц(ДатаДок+Период,1))=1 Тогда
          Возврат К.ПолучитьДату(ДатаДок,Период);
     КонецЕсли;
КонецФункции

//функция определяет количество рабочих дней в интервале дат
Функция гРабочиеДни(ДатаН,ДатаК,Вид="Основной") Экспорт
     К=СоздатьОбъект("Календарь."+Вид);
     К.УчитыватьПраздники(1);
     Если К.Автозаполнение(ДатаН,ДатаК)=1 Тогда
          Возврат К.Дней(ДатаН,ДатаК);
     КонецЕсли;
КонецФункции

//функция определяет количество праздничных дней в интервале дат
Функция гПраздники(ДатаН,ДатаК) Экспорт
     Кол=0;
     //
     П=СоздатьОбъект("Праздники");
     П.ВыбратьДаты(ДатаН,ДатаК);
     Пока П.СледующаяДата()=1 Цикл
          Если НомерДняНедели(П.Дата)<6 Тогда
               Кол=Кол+1;
          КонецЕсли;
     КонецЦикла;
     //
     Возврат(Кол);
КонецФункции

Справочники в 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);
КонецФункции

Документы в 1С

//удаление ведущих нолей в номере документа
Функция гНомерДок(Значение) Экспорт
     Текст=СокрЛП(Значение);
     Текст=СтрЗаменить(Текст," ","");
     Текст=СтрЗаменить(Текст,"_","-");
     Если Константа.ФлагНомерОсн=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С

Процедура ОбработкаЯчейкиТаблицы(Значение,Флаг,Таблица,Адрес)
     Перем Ответ;
     Перем Ко;
     Если ПустоеЗначение(Значение)=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;
     КонецЕсли;
КонецПроцедуры

Налоговый учёт и первое событие в 1С

//функция определяет сумму первого события за период по заданным остаткам на начало и конец периода
Функция гПервоеСобытие(НачД,НачК,КонД,КонК) Экспорт
     //первое событие
     СуммаД=Макс(КонД-НачД,0);
     СуммаК=Макс(КонК-НачК,0);
     //сумма
     Возврат(СуммаД+СуммаК);
КонецФункции

Резюме

В статье описаны функции и процедуры, используемые в программе "1С:Предприятие 7.7" для работы со справочниками, документами, списками значений, таблицами значений и с прочими агрегатными типами данных. Образцы практического применения описанных средств Вы сможете найти в статьях "Отчёты для 1С" и "Обработки для 1С".



статья с сайта http://love1c.kiev.ua/