Примеры программирования в 1С 8

Доброго времени суток, уважаемые коллеги! В этой статье рассмотрены некоторые кусочки кода, который часто нужны на разных этапах разработки программного кода 1С. Здесь собраны некоторые примеры, которые использовались в разных задачах, с которыми мне пришлось столкнуться. Кроме того, есть статья о примерах программирования в версии 7.7 и отдельная статья по примерам работы с табличным полем. Итак, приступим!

  1. Как правильно реализовать цикл с постусловием?
  2. Как реализовать цикл с уменьшающимся счетчиком?
  3. Как получить название документа (аналог метода 1С 7.7 Вид())?
  4. Как узнать имеет ли текущий пользователь определённую роль?
  5. Как программно формируются кнопки печати документов в 1С:Предприятие 8.2?
  6. Как сделать запись в журнал регистрации 1С:Предприятие 8?
  7. Как правильно сделать выбор из составного типа данных?
  8. Как узнать тип объекта 1С8?
  9. Как открыть выпадающий список около элемента управления формы?
  10. Как программно переключить страницу (закладку) на «Панели»?
  11. Как активизировать элемент формы?
  12. Как обратиться к текущей странице формы, если на форму не помещён элемент управления формы «Панель»?
  13. Как установить значение в поле ввода в табличной части документа?
  14. Как правильно удалить строки из текстового файла с помощью встроенного языка системы 1С8?
  15. Как в 1С8 получить из строки с разделителями определённую подстроку по её позиции?
  16. Как проверить существует ли реквизит справочника 1с8?
  17. Как перебрать субконто счёта?
  18. Как устранить ошибку: Тип не является подмножеством типа значений плана видов характеристик?

Как правильно реализовать цикл с постусловием?

Повторять = Истина;
Пока Повторять Цикл
	А=А+1;
	Повторять = (А<10);
КонецЦикла;

Благодаря переменной Повторять наш цикл выполнится хотя бы один раз.

Как реализовать цикл с уменьшающимся счетчиком?

Вариант 1.

Зн1 = 100;
Зн2 = 1;
Сч=Зн1;
Пока Сч>=Зн2 Цикл
	Сч=Сч-1;
КонецЦикла;

Вариант 2.

Вариант 2.
Для Сч = -Зн1 По -Зн2 Цикл
	// Чтобы получить положительную величину,
	// если вдруг Сч станет положительным.
	СчЗн = Макс(Сч, -Сч);
КонецЦикла;

Как получить название документа (аналог метода 1С 7.7 Вид())?

ДокументСсылка.Метаданные().Имя;
// получаем: УвольнениеИзОрганизаций
ДокументСсылка.Метаданные().ПолноеИмя();
// получаем: Документ.УвольнениеИзОрганизаций

Как узнать имеет ли текущий пользователь определённую роль?

Используйте функцию сеанса работы «РольДоступна» (IsInRole), которая определяет доступность указанной роли текущему пользователю:

Если Не РольДоступна("ПравоАдминистрирования") Тогда
    Сообщить("Роль «Право администрирования» не доступна!");
КонецЕсли;

Или используйте следующую функцию:

Функция ПравоАдмина()
	Для Каждого РольМетаданных из Метаданные.Роли Цикл
		ИмяРоли = РольМетаданных.Имя;
		Если ИмяРоли = "ПравоАдминистрирования" Тогда
			Код = СокрЛП(глТекущийПользователь.Код);
			Юзер = ПользователиИнформационнойБазы.НайтиПоИмени(Код);
			Возврат Юзер.Роли.Содержит(РольМетаданных);
		КонецЕсли;
	КонецЦикла;
КонецФункции // ПравоАдмина()

Как программно формируются кнопки печати документов в 1С:Предприятие 8.2?

  1. В модуле формы документа в процедурах ПередОткрытием, ПослеЗаписи, ОсновныеДействияФормыУстановитьПечатьПоУмолчанию добавляют вызов процедуры УстановитьКнопкиПечати.
  2. Процедура УстановитьКнопкиПечати находится модуле формы документа. В этой процедуре и происходят основные действия по формированию кнопок печати. Обратим внимание, что из нее происходит вызов функции ПолучитьДеревоМакетовПечати.
  3. Функция ПолучитьДеревоМакетовПечати получает список макетов конфигурации и внешних макетов. Для этого во втором параметре этой процедуры вызывается функция ПолучитьСтруктуруПечатныхФорм, а в ее теле функция ДобавитьВДеревоМакетовДополнительныеФормы.
  4. Процедура ПолучитьСтруктуруПечатныхФорм возвращает структуру с внутренними печатными формами. Пример:
    // Возвращает доступные варианты печати документа
    //
    // Вовращаемое значение:
    //  Струткура, каждая строка которой соответствует одному из вариантов печати
    //  
    Функция ПолучитьСтруктуруПечатныхФорм() Экспорт
        СтруктураМакетов = Новый Структура;
        СтруктураМакетов.Вставить("ПереченьЦен","Перечень цен");
        СтруктураМакетов.Вставить("Ценники", "Ценники на товары");
        СтруктураМакетов.Вставить("ПечатьДвеЦены", "Две цены");
        Возврат СтруктураМакетов;
    КонецФункции // ПолучитьСписокПечатныхФорм()
  5. С помощью процедуры ДобавитьВДеревоМакетовДополнительныеФормы получаются дополнительные печатные формы из справочника «ВнешниеОбработки».
  6. В модуле объекта документа, в процедуре Печать() добавляются условия, обрабатывающее идентификатор новой печатной формы:
    // Процедура осуществляет печать документа. Можно направить печать на
    // экран или принтер, а также распечатать необходмое количество копий.
    // Название макета печати передается в качестве параметра,
    // по переданному названию находим имя макета в соответствии.
    //
    // Параметры:
    //  НазваниеМакета - строка, название макета.
    //
    Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь) Экспорт
    
    	...
    
    	Если ИмяМакета = "ПереченьЦен" Тогда
    		ТабДокумент = ПечатьДокумента();
    	ИначеЕсли ИмяМакета = "Ценники" Тогда
    		Попытка  			
    			ТабДокумент = ПечатьЦенников(); 			
    		Исключение
    			Предупреждение("Нет прав доступа!");		
    		КонецПопытки;	
    	ИначеЕсли ИмяМакета = "ПечатьДвеЦены" Тогда
    		ТабДокумент = ПечатьДокументаДвеЦены();		
    	КонецЕсли;
    	...	
    	
    КонецПроцедуры // Печать()
    

Как сделать запись в журнал регистрации 1С:Предприятие 8?

Процедура РегистрСведенийСписокДополнительныеУслугиПередУдалением(Элемент)
	ТС = Элемент.ТекущаяСтрока;
	Комментарий = "Код: " + ТС.Код +
		    ". Номенклатура: " + ТС.Номенклатура +
		    ". Вид наценки: " + ТС.ВидНаценки;
	ЗаписьЖурналаРегистрации("Данные.Удаление",
		УровеньЖурналаРегистрации.Информация,
		Метаданные.РегистрыСведений.ДополнительныеУслуги,
		РежимТранзакцииЗаписиЖурналаРегистрации.Независимая,
		Комментарий);
КонецПроцедуры

Как правильно сделать выбор из составного типа данных?

Процедура УслугиПунктОтправкиНачалоВыбора(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	МассивТипов = Новый Массив();
	МассивТипов.Добавить(Тип("СправочникСсылка.НаселённыеПункты"));
	ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
	ЭлементыФормы.Услуги.Колонки.ПунктОтправки.
	ЭлементУправления.ОграничениеТипа = ОписаниеТипов;
	
	// Первый вариант
	ЭлементыФормы.Услуги.Колонки.ПунктОтправки.ЭлементУправления.Значение =
	ОписаниеТипов.ПривестиЗначение(
	ЭлементыФормы.Услуги.Колонки.ПунктОтправки.ЭлементУправления.Значение);
	
	// Второй вариант
	ОписаниеТипов.ПривестиЗначение(
	ЭлементыФормы.Услуги.ТекущаяСтрока.ПунктОтправки);
	
КонецПроцедуры

Как узнать тип объекта 1С8?

Если ТипЗнч(ТекОбъект) = Тип("СправочникСсылка.Номенклатура") Тогда
	...
КонецЕсли;

Если ТипЗнч(ТекОбъект) = Тип("Строка") Тогда
	...
КонецЕсли;

Как программно переключить страницу (закладку) на «Панели»?

Панель1 = ЭлементыФормы.Панель1;
Панель1.ТекущаяСтраница = Панель1.Страницы.Страница2;
Панель1.ТекущаяСтраница = Панель1.Страницы["Страница2"];

Как открыть выпадающий список около элемента управления формы?

Воспользуемся методом формы ВыбратьИзМеню(<СписокЗначений>, <ЭлементФормы>):

//выведем пользователю список вариантов, 
//для ввода СФ около элемента управления «Кнопка»
СписокДействийВводСФ = Новый СписокЗначений();
СписокДействийВводСФ.Добавить("ВвестиНовыйСчетФактуру", "Ввести новый счет-фактуру");
СписокДействийВводСФ.Добавить("ДополнитьСуществующийСчетФактуру", "Дополнить существующий счет-фактуру");
// ФормаДокумента.ТекущийЭлемент - 
//Элемент, около которого открывается список 
ВыбранныйВариантВводаСФ = ФормаДокумента.ВыбратьИзМеню(СписокДействийВводСФ, ФормаДокумента.ТекущийЭлемент);
Если ВыбранныйВариантВводаСФ = Неопределено Тогда
	Возврат;
КонецЕсли;

Если ВыбранныйВариантВводаСФ.Значение = "ВвестиНовыйСчетФактуру" Тогда
	...
КонецЕсли;

Как активизировать элемент формы?

Воспользуйтесь свойством «ТекущийЭлемент» объекта «Форма».

Если НЕ ЗначениеЗаполнено(Ответственный) Тогда
	Предупреждение("Сначала заполните поле: Ответственный!", 3);
	ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.Ответственный;
КонецЕсли;

Как обратиться к текущей странице формы, если на форму не помещён элемент управления формы «Панель»?

У формы есть свойство «Панель», обращаемся через него.

ЭтаФорма.Панель.ТекущаяСтраница = ...

Пример использования:

ПанельФормы = ЭтаФорма.Панель;
СтраницыФормы = ПанельФормы.Страницы;
Если ПанельФормы.ТекущаяСтраница = СтраницыФормы.Страница1 Тогда
      //Мы на первой странице
      . . .
ИначеЕсли ПанельФормы.ТекущаяСтраница = СтраницыФормы.Страница2 Тогда
      //Мы на второй странице
      . . .
Иначе //Мы на последней странице
      . . .
КонецЕсли;

Как установить значение в поле ввода в табличной части документа?

У нас есть документ, в котором табличная часть «Состав» содержит реквизит «Автомобиль» типа «СправочникСсылка.ТранспортныеСредства». Нужно, чтобы рядом стоящее поле ввода «НомерАвтомобиля» заполнялось значением из реквизита «Автомобиль.ГосНомер».

Установленное значение в поле ввода «НомерАвтомобиля» в табличной части документа

Как установить значение в поле ввода «НомерАвтомобиля» для каждой строки табличной части? В обработчике событий ПриПолученииДанных табличной часть «Состав» напишем следующий код:

Процедура СоставПриПолученииДанных(Элемент, ОформленияСтрок)
	Для каждого ОформлениеСтроки из ОформленияСтрок цикл
		ВычисленноеЗначение =
		ОформлениеСтроки.Ячейки.Автомобиль.Значение.ГосНомер;
		Оформлениестроки.Ячейки.НомерАвтомобиля.
		УстановитьТекст(ВычисленноеЗначение);
	КонецЦикла
КонецПроцедуры

Как правильно удалить строки из текстового файла с помощью встроенного языка системы 1С8?

Предположим, нужно удалить все строки из текста, которые содержат слово «1С».

Процедура УдалитьСтрокиТекста()
	ТекстДок = Новый ТекстовыйДокумент;
	ТекстДок.Прочитать("Текст.txt");
	Сч = 1;
	Пока Сч < ТекстДок.КоличествоСтрок() Цикл
		Строка = ТекстДок.ПолучитьСтроку(Сч);
		Если Найти(Строка, "1С") > 0 Тогда
			ТекстДок.УдалитьСтроку(Сч);
		Иначе  // Благодаря этой переменной мы 
			// не пропускаем строки в тексте
			Сч = Сч + 1;
		КонецЕсли;
	КонецЦикла;
	ТекстДок.Записать("Текст.txt");
КонецПроцедуры

Подобная процедура для правильного удаления строк таблицы значений описана тут. Также можете взглянуть на реализацию удаления строк в текстовом файле на PHP.

Как в 1С8 получить из строки с разделителями определённую подстроку по её позиции?

Для решения этой задачи используем функцию ПолучитьСтр():

//******************************************************************************
// ПолучитьСтр(знач ГдеИщем, Ном = 1, Р = ",")
//
// Параметры: 
//  знач ГдеИщем - строка, Ном = 1 - число, Р = "," - строка
//
// Возвращаемое значение:
//  Строка
//
// Описание:
//  Возвращает подстроку под номером Ном из строки ГдеИщем с разделителями Р  
//  
Функция ПолучитьСтр(знач ГдеИщем, Ном = 1, Р = ";")
	Ном1 = Число(Ном);
	Поз=Найти(ГдеИщем,Р);
	Если (Поз = 0) Тогда Возврат ГдеИщем;КонецЕсли;
	Стр1=Лев(ГдеИщем,Поз-1);
	Если Ном1 = 1 Тогда Возврат Стр1;КонецЕсли;
	СчетчикЦикла = 0;
	Для СчетчикЦикла = 2 По Ном1 Цикл
		ГдеИщем=Сред(ГдеИщем,Поз+1,СтрДлина(ГдеИщем)-Поз);
		Поз=Найти(ГдеИщем,Р);
		Если (Поз = 0) Тогда Возврат ГдеИщем;КонецЕсли;
		Стр=Лев(ГдеИщем,Поз-1);
		Если Ном1 = СчетчикЦикла Тогда Возврат Стр;КонецЕсли;
	КонецЦикла;
КонецФункции // ПолучитьСтр()

Пример использования:

НужнаяСтрока = "1С,PHP,Delphi,HTML,CSS";
Сообщить(ПолучитьСтр(НужнаяСтрока, 3, ","));

В окно служебных сообщений будет выведена подстрока «Delphi». Чтобы посмотреть как работает эта функция вы можете скачать внешнюю обработку здесь.

Пример работы функции ПолучитьСтр() в обработке 1С8

Посмотрите как реализована работа такой же функции в 1С 7.7.

Как проверить существует ли реквизит справочника 1с8?

СтатьяЗатрат.Метаданные().Реквизиты.Найти("ПринятиеКНалоговомуУчету") <> Неопределено

Как перебрать субконто счёта?

Процедура ПолучитьСубконтоСчета(Счет)
	ВидыСубконто = Счет.ВидыСубконто;
	Для Каждого ВидСубконто Из ВидыСубконто Цикл
		Сообщить(ВидСубконто.ВидСубконто);
	КонецЦикла;
КонецПроцедуры

Как устранить ошибку: Тип не является подмножеством типа значений плана видов характеристик?

При попытке перенести данные из одной базы в другую возникла ошибка:

Ошибка при установке значения атрибута контекста (ТипЗначения): 
Тип не является подмножеством типа значений плана видов характеристик

Не переносилось число с длиной 18 и точностью 6 (18.6) из базы источника, так как было установлена длина 15, точность 3 (15.3) в базе приемнике. Чтобы решить данную проблему, нужно в текущем плане видов характеристик изменить длину и точность с 15.3 на 18.6 в диалоге редактирования типа данных.


ПОДПИСКА

4 ответы
  1. Эльмира говорит:

    Спасибо большое! очень помогло!

  2. Softmaker говорит:

    Пожалуйста! А что именно помогло?

  3. Ирина говорит:

    Мне помогла тема «Как программно переключить страницу (закладку) на «Панели»?» Спасибо большое.

Комментарии закрыты.