Тел.:
(495) 220-50-32
ICQ:
410142143
E-mail: info@abs1c.ru
В этой статье описываются полезные функции и процедуры, помогающие эффективно работать с различными типами данных в системе "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
Тогда
Список.ТекущаяСтрока(Позиция);
КонецЕсли;
КонецПроцедуры
//процедура сдвигает строку в таблице
значений;
//если сдвигается последняя строка вниз, то строка становится
первой;
//если сдвигается первая строка вверх, то строка перемещается в
конец таблицы значений
Процедура
Количество=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;
КонецФункции
//ф//функция возвращает дату, находящуюся на
определённом интервале дней от заданной даты, без учёта
выходных;
//например, используется для определения конечной даты
действия счёта-фактуры
Функция an
class="color-blue">гСрокДействия(ДатаДок,Период,Вид="Основной")
Экспорт
К=СоздатьОбъект("Календарь."+Вид);
К.УчитыватьПраздники(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С".