В этой статье описываются полезные функции и процедуры, помогающие эффективно работать с различными типами данных в системе "1С:Предприятие 7.7".
* Обработка значений
    * Форматирование
    * Список значений
    * Таблица значений
    * Таблица
    * Период и дата
    * Календари и праздники
    * Справочники
    * Документы
    * Предопределённые функции
    * Налоговый учёт
Обработка значений в 1С 
Код //функция проверяет, является ли переданный в функцию Символ числом
Функция ЭтоЧисло(Символ) Экспорт
     Если (КодСимв(Символ)>=48) И (КодСимв(Символ)<=57) Тогда
          Возврат(1);
     Иначе
          Возврат(0);
     КонецЕсли;
КонецФункции
//функция возвращает копейки
Функция гКопейки(Значение) Экспорт
     Грн=Цел(Значение);
     Коп=Значение-Грн;
     Возврат(Коп
0);
КонецФункции
//функция возвращает сумму без скидки
Функция гСкидка(Сумма,Скидка) Экспорт
     Возврат Сумма*(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С".
Источник публикации 
	 
	
	 
	  
    Разместил: Андрей Громов |  |  Прочитано: 197118 |  |