Примеры программирования в 1С 8
Доброго времени суток, уважаемые коллеги! В этой статье рассмотрены некоторые кусочки кода, который часто нужны на разных этапах разработки программного кода 1С. Здесь собраны некоторые примеры, которые использовались в разных задачах, с которыми мне пришлось столкнуться. Кроме того, есть статья о примерах программирования в версии 7.7 и отдельная статья по примерам работы с табличным полем. Итак, приступим!
- Как правильно реализовать цикл с постусловием?
- Как реализовать цикл с уменьшающимся счетчиком?
- Как получить название документа (аналог метода 1С 7.7 Вид())?
- Как узнать имеет ли текущий пользователь определённую роль?
- Как программно формируются кнопки печати документов в 1С:Предприятие 8.2?
- Как сделать запись в журнал регистрации 1С:Предприятие 8?
- Как правильно сделать выбор из составного типа данных?
- Как узнать тип объекта 1С8?
- Как открыть выпадающий список около элемента управления формы?
- Как программно переключить страницу (закладку) на «Панели»?
- Как активизировать элемент формы?
- Как обратиться к текущей странице формы, если на форму не помещён элемент управления формы «Панель»?
- Как установить значение в поле ввода в табличной части документа?
- Как правильно удалить строки из текстового файла с помощью встроенного языка системы 1С8?
- Как в 1С8 получить из строки с разделителями определённую подстроку по её позиции?
- Как проверить существует ли реквизит справочника 1с8?
- Как перебрать субконто счёта?
- Как устранить ошибку: Тип не является подмножеством типа значений плана видов характеристик?
Как правильно реализовать цикл с постусловием?
Повторять = Истина; Пока Повторять Цикл А=А+1; Повторять = (А<10); КонецЦикла;
Благодаря переменной Повторять наш цикл выполнится хотя бы один раз.
Как реализовать цикл с уменьшающимся счетчиком?
Вариант 1.
Зн1 = 100; Зн2 = 1; Сч=Зн1; Пока Сч>=Зн2 Цикл Сч=Сч-1; КонецЦикла;
Вариант 2.
Вариант 2. Для Сч = -Зн1 По -Зн2 Цикл // Чтобы получить положительную величину, // если вдруг Сч станет положительным. СчЗн = Макс(Сч, -Сч); КонецЦикла;
Как получить название документа (аналог метода 1С 7.7 Вид())?
ДокументСсылка.Метаданные().Имя; // получаем: УвольнениеИзОрганизаций ДокументСсылка.Метаданные().ПолноеИмя(); // получаем: Документ.УвольнениеИзОрганизаций
Как узнать имеет ли текущий пользователь определённую роль?
Используйте функцию сеанса работы «РольДоступна» (IsInRole), которая определяет доступность указанной роли текущему пользователю:
Если Не РольДоступна("ПравоАдминистрирования") Тогда Сообщить("Роль «Право администрирования» не доступна!"); КонецЕсли;
Или используйте следующую функцию:
Функция ПравоАдмина() Для Каждого РольМетаданных из Метаданные.Роли Цикл ИмяРоли = РольМетаданных.Имя; Если ИмяРоли = "ПравоАдминистрирования" Тогда Код = СокрЛП(глТекущийПользователь.Код); Юзер = ПользователиИнформационнойБазы.НайтиПоИмени(Код); Возврат Юзер.Роли.Содержит(РольМетаданных); КонецЕсли; КонецЦикла; КонецФункции // ПравоАдмина()
Как программно формируются кнопки печати документов в 1С:Предприятие 8.2?
- В модуле формы документа в процедурах ПередОткрытием, ПослеЗаписи, ОсновныеДействияФормыУстановитьПечатьПоУмолчанию добавляют вызов процедуры УстановитьКнопкиПечати.
- Процедура УстановитьКнопкиПечати находится модуле формы документа. В этой процедуре и происходят основные действия по формированию кнопок печати. Обратим внимание, что из нее происходит вызов функции ПолучитьДеревоМакетовПечати.
- Функция ПолучитьДеревоМакетовПечати получает список макетов конфигурации и внешних макетов. Для этого во втором параметре этой процедуры вызывается функция ПолучитьСтруктуруПечатныхФорм, а в ее теле функция ДобавитьВДеревоМакетовДополнительныеФормы.
- Процедура ПолучитьСтруктуруПечатныхФорм возвращает структуру с внутренними печатными формами. Пример:
// Возвращает доступные варианты печати документа // // Вовращаемое значение: // Струткура, каждая строка которой соответствует одному из вариантов печати // Функция ПолучитьСтруктуруПечатныхФорм() Экспорт СтруктураМакетов = Новый Структура; СтруктураМакетов.Вставить("ПереченьЦен","Перечень цен"); СтруктураМакетов.Вставить("Ценники", "Ценники на товары"); СтруктураМакетов.Вставить("ПечатьДвеЦены", "Две цены"); Возврат СтруктураМакетов; КонецФункции // ПолучитьСписокПечатныхФорм()
- С помощью процедуры ДобавитьВДеревоМакетовДополнительныеФормы получаются дополнительные печатные формы из справочника «ВнешниеОбработки».
- В модуле объекта документа, в процедуре Печать() добавляются условия, обрабатывающее идентификатор новой печатной формы:
// Процедура осуществляет печать документа. Можно направить печать на // экран или принтер, а также распечатать необходмое количество копий. // Название макета печати передается в качестве параметра, // по переданному названию находим имя макета в соответствии. // // Параметры: // НазваниеМакета - строка, название макета. // Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 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С 7.7.
Как проверить существует ли реквизит справочника 1с8?
СтатьяЗатрат.Метаданные().Реквизиты.Найти("ПринятиеКНалоговомуУчету") <> Неопределено
Как перебрать субконто счёта?
Процедура ПолучитьСубконтоСчета(Счет) ВидыСубконто = Счет.ВидыСубконто; Для Каждого ВидСубконто Из ВидыСубконто Цикл Сообщить(ВидСубконто.ВидСубконто); КонецЦикла; КонецПроцедуры
Как устранить ошибку: Тип не является подмножеством типа значений плана видов характеристик?
При попытке перенести данные из одной базы в другую возникла ошибка:
Ошибка при установке значения атрибута контекста (ТипЗначения): Тип не является подмножеством типа значений плана видов характеристик
Не переносилось число с длиной 18 и точностью 6 (18.6) из базы источника, так как было установлена длина 15, точность 3 (15.3) в базе приемнике. Чтобы решить данную проблему, нужно в текущем плане видов характеристик изменить длину и точность с 15.3 на 18.6 в диалоге редактирования типа данных.
Спасибо большое! очень помогло!
Пожалуйста! А что именно помогло?
Мне помогла тема «Как программно переключить страницу (закладку) на «Панели»?» Спасибо большое.
Рад, что вам помогло!