Настоящая публикация является незавершенной и может содержать ошибки и неточности!
В публикации в компактной форме систематизируется практический опыт профессиональной адаптации к разработке на платформе 1С:Предприятие 8.3 приложений на управляемых формах, после многолетнего опыта разработки для 1С:Предприятие 7.7, поэтому общие базовые вопросы программирования не объясняются, но затрагиваются ключевые отличия 8.x от 7.7.
- 1С:ИТС //its.1c.ru YOlga1981@reks.biz
- Заметки из Зазеркалья: Технологический блог фирмы 1С //wonderland.v8.1c.ru/
- Для начинающих разработчиков //v8.1c.ru
- 1С:Предприятие 8.3. Руководство разработчика //master1c8.ru...83.002.05.pdf
- Дата выхода: 29 мая 2013 г
- Номер издания: 83.002.05
- Регистрация ошибок платформы в 1С //infostart.ru
- Неофициальные материалы:
- Горячие, или быстрые кнопки для пользователя 1С 8.3 //programmist1s.ru
- В.В.Милькин //helpme1c.ru
- Справочные материалы по 1С Частный программист 1С Вадим //pro1c.ru
- СКД - Система Компоновки Данных //habr.com
- Курсы по программированию в 1С:Предприятие 8.3 / 8.2 //курсы-по-1с.рф
- 1С-справочник типовых задач (парадигмов) 8.х //sites.google.com
- Google.com & ya.ru
Основные сведение о программном коде
Платформа 1С:Предприятие 8.2 реализует исполнение трех основных видов программного кода:
- код серверного модуля предназначен для управления данными и основной логикой приложения;
- код модуля клиента предназначен для управления интерфейсом
- полностью отделен и получает все необходимые данные от сервера и передает на сервер данные которые следует обработать или сохранить;
- из кода клиента непосредственно недоступны объекты и функции связанные с данными, но доступны функции связанные с работой интерфейсных объектов, недоступные на сервере;
- передача данных между сервером и клиентом происходит через XDTO;
- далеко не все данные могут быть переданы через XDTO, поскольку на второй стороне их абстракция может не поддерживаться, в таких случаях возникает ошибка XDTO;
- организация серверных вызовов требует тщательно продуманного подхода для снижения потерь производительность и снижения нагрузки на канал передачи данных;
- язык запросов к БД структурно и синтаксически существенно отличается от кода модулей, но правила построения выражений сходны с серверными модулями;
- код запросов располагает предопределенным набором функций (ни серверные, ни клиентские функции в коде запросов недоступны)
- подробно язык запросов описан в публикации Язык запросов на платформе 1С:Предприятие8.3 //reks.biz
Описание процедур и функций в программных модулях, выполненные в соответствии с регламентом, отображаются в справочной системе и синтаксическом конструкторе конфигуратора.
Регламент описания подробно описан на //its.1c.ru
Модули
Модули в конфигурации содержат тексты исходного кода. Предусмотрено несколько видов программных модулей, отличающиеся расположением в конфигурации, по назначению, по структуре, по типу компиляции и исполнения:
- Модуль обычного приложения
- Модуль управляемого приложения
- Модуль сеанса
- Модуль внешнего соединения
- Общие модули
- Модули менеджера значения
- Модули объекта
- Модули менеджера
- Модули форм
- Модули команд
- Модули набора записей
Подробно модули описаны в публикации Разработка модулей на платформе 1С:Предприятие 8.3
Типы
Любой программный объект данных обладает значением определенного типа, и этот тип может быть выражен специальным объектом типа Тип, у которого есть имя. Официальный глоссарий 1С определяет различает три вида типов:
- Простые типы: Булево, Строка, Дата, Число, Неопределено, Null. Их имена предопределены платформой.
- Коллекции значений (или Универсальные коллекции): Массив, Структура, Соответствие, СписокЗначений, ТаблицаЗначений
- Прикладные типы: все остальные Константы, Справочники, Документы, Модули и другие, имена и свойства которых определяются в Конфигураторе.
Все Типы образуют семейство объектов специального типа, которые можно динамически создавать, модифицировать в пределах квалификаторов, присваивать и сравнивать. Важно понимать, что Типом в привычном смысле может обладать только значение, и это - определенный и единственный тип, характеризующий значение.
В то же время Реквизит, который предназначен для хранения значения, характеризует не Тип, а ОписаниеТипов, которое шире, чем Тип. Тип ОписаниеТипов реквизита характеризует набор и вариации типов допустимых для значений реквизита. Как программные объекты и Тип и ОписаниеТипов - это объекты разных типов, которые не заменяют друг друга и не конвертируются друг в друга по умолчанию, хотя в справочной системе конфигуратора это не всегда понятно, так если для метода указан параметр <Тип>, то на самом деле может подразумеваться <ОписаниеТипов>.
Типы значений
Набор возможных объектов Тип предопределен платформой и прикладными типами определенными в конфигураторе.
- Тип(<имя типа>) позволяет получить/создать объект Типа для указанно типа по его имени (не объект указанного типа, а именно Тип его типа);
- Тип("Строка"), Тип("Число"), Тип("Дата"), Тип("Булево"), Тип("Null") возвращают простые Типы;
- Тип("Массив"), Тип("Структура"), Тип("Соответствие") возвращают тип коллекции значений;
- существует большое число прикладных типов, которые можно условно классифицировать
- прикладные типы объектов ИБ конфигурации, которые образуют семейства
- тип <тип>Ссылка - определяет конкретный объект, который хранится в ИБ и может быть получен для использования, существует и на Клиенте и на Сервере.
- тип <тип>Объект - это объект ИБ находящийся в памяти и доступный для использования, существует только на Сервере.
- тип <тип>Выборка - это объект набора объектов ИБ этого семейства.
- Тип("СправочникСсылка.<имя справочника>") возвращает прикладной тип ссылки справочника;
- Тип("ДокументОбъект.<имя документа>") возвращает прикладной тип объекта документа;
- прикладные типы системы, объекты которых всегда находятся в памяти
- типы для оперирования Данными на Сервере
- типы для оперирования Данными на Клиенте
- типы элементов графического интерфейса
- прикладные типы объектов ИБ конфигурации, которые образуют семейства
- ТипЗнч(<значение>) позволяет получить/создать объект Типа для указанного значения;
- Строка(<Тип>) позволяет получить краткое имя типа, создать прикладной объект по краткому имени нельзя;
- ТипЗнч(<значение>) = Тип("<полное имя проверяемого типа>") - правильное сравнение соответствия типа;
- Ссылка.Метаданные().Имя = "ПоступлениеТоваровУслуг" - неправильное сравнение типа;
- <прикладнаяСсылка>.Метаданные().ПолноеИмя() возвращает полное имя прикладного типа объекта, включающее семейство
- Метаданные.НайтиПоТипу(<Тип объекта>).ПолноеИмя() другой способ получить полное имя типа по Типу без объекта
- <прикладной тип Менеджер>.ТипВсеСсылки() семейство подтипов Ссылка, Объект, Выборка прикладного типа
- <прикладной тип Менеджер>.ТипВсеСсылки().СодержитТип(ТипЗнч(<объект>)) проверяет принадлежность типа объекта к семейству типов прикладного типа
Описание типов реквизитов
Объекты ОписаниеТипов определяются в конфигурации и могут создаваться динамически в модулях с произвольными наборами Типов:
- Новый ОписаниеТипов(<Типы>, <ДобавляемыеТипы>, <ВычитаемыеТипы>, <КвалификаторыЧисла>, <КвалификаторыСтроки>, <КвалификаторыДаты>, <КвалификаторыДвоичныхДанных>) создает объект описания типов
- <Типы> допустимо указать строковое <имя типа>
- ОписаниеТипов(ТипЗнч(<значение>),... недопустимо в параметре <Типы> использовать объект Тип
- ОписаниеТипов(Строка(ТипЗнч(<значение>)),... можно получить имя типа из Типа и функцией Строка(), если это простой тип или тип коллекции
- функция Строка() не пригодна для Типа прикладного объекта, поскольку возвращает короткое имя без имени семейства
- допустимо использовать подготовленный массив из одного или нескольких Типов: ОписаниеТипов(ТипыМассив,...
- набор типов может быть произвольным и включать простые и прикладные типы
- ДобавляемыеТипы
- ВычитаемыеТипы
- Квалификаторы уточняют свойства простых типов включаемых в ОписаниеТипов
- КвалификаторыЧисла(<длина>,<точность>, <ДопустимыйЗнак>)
- КвалификаторыСтроки(<ДлинаСтроки>, <ДопустимаяДлина>)
-
КвалификаторыДаты(<ЧастиДаты>)
- КвалификаторыДвоичныхДанных(<Длина>, <ДопустимаяДлина>)
- <Типы> допустимо указать строковое <имя типа>
-
Новый ОписаниеТипов(<ИсходноеОписаниеТипов>, <ДобавляемыеТипы>, <ВычитаемыеТипы>, <Квалификаторы...) создает новое ОписаниеТипов на основании исходного
- <реквизит>.ТипЗначения.Типы() - массив допустимых типов реквизита
- <реквизит>.ТипЗначения.Типы().СодержитТип(<Тип>)=Истина - проверяет допустимость указанного Типа в качестве значения реквизита
///
Пример простого назначения описания типов в колонках таблицы значений:
1 2 3 4 5 |
Таблица.Колонки.Добавить("Числовая", Новый ОписаниеТипов("Число")); Таблица.Колонки.Добавить("Строковая", Новый ОписаниеТипов("Строка")); Таблица.Колонки.Добавить("Справочника", Новый ОписаниеТипов("СправочникСсылка.ВопросыШаблонаАнкеты")); Таблица.Колонки.Добавить("ПВХ", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования")); Таблица.Колонки.Добавить("Характеристика", Метаданные.ПланыВидовХарактеристик.ВопросыДляАнкетирования.Тип); |
Примеры:
1 2 3 4 5 |
МассивТипов = Новый Массив; МассивТипов.Добавить("Булево"); МассивТипов.Добавить("Структура"); МассивТипов.Добавить("СправочникСсылка.Номенклатура"); ОписаниеСоставногоТипа = Новый ОписаниеТипов(МассивТипов); |
///
1 2 3 4 5 6 7 8 9 10 |
// установка ограничения типа простого реквизита формы Элементы.<Реквизит>.ОграничениеТипа = ОписаниеТипа; <Реквизит> = Элементы.<Реквизит>.ОграничениеТипа.ПривестиЗначение(<Реквизит>); // установка ограничения типа табличного реквизита Элементы.<ТабличнаяЧасть>.Колонки.<КолонкаРеквизита>.ЭлементУправления.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов); Элементы.<ТабличнаяЧасть>.ТекущаяСтрока.<КолонкаРеквизита> = ПривестиЗначение(Элементы.<ТабличнаяЧасть>.ТекущаяСтрока.<КолонкаРеквизита>); Элементы.<ТабличнаяЧасть>.Колонки.<КолонкаРеквизита>.ЭлементУправления.ОграничениеТипа = ОписаниеСоставногоТипа; // ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.ЗначениеПеречисления = ОписаниеТипов.ПривестиЗначение(ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.ЗначениеПеречисления); ЭлементыФормы.ТабличнаяЧасть1.Колонки.ЗначениеПеречисления.ЭлементУправления.Значение = ОписаниеТипов.ПривестиЗначение(ЭлементыФормы.ТабличнаяЧасть1.Колонки.ЗначениеПеречисления.ЭлементУправления.Значение); |
///
1 2 3 4 5 6 7 8 9 10 |
МассивТипов = Новый Массив; МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура")); ОписаниеТипа = Новый ОписаниеТипов(МассивТипов); // установка ограничения типа табличного реквизита ЭлементыФормы.<ТабличнаяЧасть>.Колонки.<КолонкаРеквизита>.ЭлементУправления.ОграничениеТипа = ОписаниеТипа; // приведение типа // ЭлементыФормы.<ТабличнаяЧасть>.ТекущаяСтрока.<КолонкаРеквизита> = ОписаниеТипов.ПривестиЗначение(ЭлементыФормы.<ТабличнаяЧасть>.ТекущаяСтрока.<КолонкаРеквизита>); ЭлементыФормы.<ТабличнаяЧасть>.Колонки.<КолонкаРеквизита>.ЭлементУправления.Значение = ОписаниеТипов.ПривестиЗначение(ЭлементыФормы.<ТабличнаяЧасть>.Колонки.<КолонкаРеквизита>.ЭлементУправления.Значение); |
Источник: Тип реквизита и тип значения на //kb.mista.ru
Прикладные типы
Приведенная конструкция позволяет получить ОбъектМетаданные прикладного типа и полное имя типа:
1 2 3 4 5 6 7 8 |
&НаСервере ПолноеИмяТипа = <значение>.Метаданные().ПолноеИмя(); // или МетаТип = Метаданные.НайтиПоТипу(ТипЗнч(<значение>)); ПолноеИмяТипа = МетаТип.ПолноеИмя(); // на заметку ЭтоСправочник = Метаданные.Справочники.Содержит(МетаТип); ЭтотЖеМетаТип = Метаданные.Справочники.Найти(МетаТип.Имя); |
Массив
Массив 1С является упорядоченной коллекцией произвольных значений...
Структура
Структура 1С является коллекцией элементов типа КлючИЗначение, в которых строковый ключ должен соответствовать требованиям идентификаторов, а значение может быть произвольного типа. Коллекция Структуры может содержать только одну пару с заданным значением ключа. Таким образом любой элемент коллекции структуры может быть получен и/или установлен по ключу минимальными синтаксическими средствами. Предусмотрено два вида конструкторов:
1 2 3 4 5 |
ПустаяСтруктура = Новый Структура; СтруктураДанных = Новый Структура("Кто,Где,Когда", "Я", Константы.ГдеЯ, Неопределено); КтоЯ = СтруктураДанных.Кто; СтруктураДанных.Когда = ТекущаяДата(); СтруктураДанных.Вставить("Сколько", 1000); |
Пример итератора элементов структуры:
1 2 3 4 5 6 |
// пример итератора почти равноценен выражению <Структура>.<образец> = <новое значение>; Для Каждого <Элемент> Из <Структура> Цикл Если <Элемент>.Ключ = <образец> Тогда <Элемент>.Значение = <новое значение>; КонецЕсли; КонецЦикла; |
Соответствие
Соответствие 1С является коллекцией элементов типа КлючИЗначение аналогично Структуре с тем отличием, что ключу не предъявляется требований по типу и значению.
СписокЗначений
...
ТаблицаЗначений
Таблица значений служит программным средством организации и обработки табличных данных. Сама таблица значений является коллекцией элементов типа СтрокаТаблицыЗначений, состав колонок таблицы значений определяется коллекцией Колонки. Для ускорения выполнения методов таблица значения может использовать индексы в коллекции Индексы.
В отличие от 1С 7.7 таблица значений в 1С 8.х не имеет методов отображения, но элементы форм могут использовать таблицу значений в качестве источника данных для отображения. Ниже приведен пример простейшего способа отобразить содержание таблицы значений в табличном документе:
1 2 3 4 5 6 7 |
ТабДокумент = Новый ТабличныйДокумент; Построитель = Новый ПостроительОтчета; Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(<ТаблицаЗначений>); Построитель.Вывести(ТабДокумент); ... &НаКлиенте ТабДокумент.Показать("Пользователи"); |
Таблица значений может быть передана в запрос через параметр:
1 2 3 4 5 6 7 8 |
Запрос.УстановитьПараметр("ТаблицаФормы", ТоварыВТаблице) ... Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ТаблицаФормы.Код, | ТаблицаФормы.Наименование |ПОМЕСТИТЬ ТаблицаЗапроса |ИЗ | &ТаблицаФормы КАК ТаблицаФормы |
...
ДеревоЗначений
Дерево значений напоминает Таблицу значений, у которой каждая строка дополнительно имеет коллекцию Строки, содержащую ее подчиненные строки, у которых также имеется коллекция Строки!!!
...
ТабличныйДокумент
Табличный документ - это объект серверного размещения, который только отображается на Клиенте, поэтому оперировать табличным документом следует кодом на сервере.
- Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная,2)
///
Уникальный Идентификатор
Всякий объект данных хранимый в ИБ обладает своим уникальным идентификатором, у которого есть символическое представление вида xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Для использования уникального идентификатора существует специальный тип УникальныйИдентификатор
- ДанныеОбъект.Ссылка.УникальныйИдентификатор() извлекает объект идентификатора из ссылки объекта данных
- код Новый УникальныйИдентификатор создает объект нового идентификатора с уникальным значением в произвольном коде модуля
- код Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") создает объект нового пустого идентификатора, который можно использовать в критерии для поиска не инициированных значений идентификатора
- код Новый УникальныйИдентификатор("954f76c4-8ec3-11ea-88x8-dx5x9947e11a") создает объект нового идентификатора с заданным значением
- значение уникального идентификатора не позволяет определить тип идентифицируемого им объекта, поэтому для поиска объект следует обойти все коллекции типов ИБ.
Для любого объекта ИБ можно создать и присвоить новый УникальныйИдентификатор со случайным или определенным значением:
1 2 3 4 5 |
ДанныеОбъект = Справочники.Данные.СоздатьЭлемент(); ДанныеУИД = Новый УникальныйИдентификатор("954f76c4-8ec3-11ea-88x8-dx5x9947e11a"); ДанныеСсылка = Справочники.Данные.ПолучитьСсылку(ДанныеУИД); ДанныеОбъект.УстановитьСсылкуНового(ДанныеСсылка); ДанныеОбъект.Записать(); |
Присвоение объектам УникальногоИдентификатора гарантирует фактическую уникальность только в пределах прикладного типа. Если идентификатор будет присвоен нескольким объектам разных типов, то подобная коллизия может быть выявлена только при Тестирования ИБ или специальными программными средствами.
Общие элементы конфигурации
Подсистемы
Функциональные опции
...
Параметры сеанса
...
.
Прикладные элементы конфигурации
Справочники
- Стандартные реквизиты справочника включают:
- Ссылка
- Код
- Наименование
- Владелец
- Родитель
- ЭтоГруппа
- ПометкаУдаления
- Предопределенный
- ИмяПредопределенныхДанных
- Формы справочника могут относится к видам:
- Форма элемента справочника
- Форма группы справочника
- Форма списка справочника
- Форма выбора справочника
- Форма выбора группы справочника
- Произвольная форма
Примеры использования: Справочники в языке 1С 8.3, 8.2 (в примерах) //helpme1c.ru
Документы
Примеры использования: Документы в языке 1С 8.3, 8.2 (в примерах) //helpme1c.ru
Перечисления
Способ доступа к перечислениям в коде зависит от места исполнения кода:
1 2 3 4 5 6 7 |
&НаКлиенте ... = ПредопределенноеЗначение("Перечислени<strong>е</strong>.<имя перечисления>.<значение перечисления>") &НаСервере ... = Перечислени<strong>я</strong>.<имя перечисления>.<значение перечисления> Запрос.Текст = "... = ЗНАЧЕНИЕ(Перечисление.<имя перечисления>.<значение перечисления>) |
Перечисления в языке 1С 8.3, 8.2 (в примерах) //helpme1c.ru
Отчеты
Обработки
Планы видов характеристик
Регистры сведений
В модуле набора записей данные доступны через объект Запись
Пример кода записи в регистр сведений в процедуре проведения документа:
1 2 3 4 5 6 7 8 9 10 |
Процедура ОбработкаПроведения(Отказ, Режим) НаборЗаписей = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Ссылка); Для Каждого СтрокаТаблицы ИЗ ТаблицаДокумента Цикл НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Период = Дата; НоваяЗапись.РеквизитИзДокумента = РеквизитДокумента; НоваяЗапись.РеквизитИзТаблицыДокумента = СтрокаТаблицы.РеквизитТаблицыДокумента; КонецЦикла; НаборЗаписей.Записать(); |
Пример кода добавления с перезаписью одной записи в независимый регистр сведений (подробней на на //its.1c.ru):
1 2 3 4 5 |
МенеджерЗаписи = РегистрыСведений.МойРегистр.СоздатьМенеджерЗаписи(); МенеджерЗаписи.Период = Дата; МенеджерЗаписи.РеквизитИзДокумента = РеквизитДокумента; МенеджерЗаписи.РеквизитИзТаблицыДокумента = РеквизитТаблицыДокумента; МенеджерЗаписи.Записать(); |
Пример кода модификации записей подчиненного регистра сведений на //its.1c.ru
Регистры сведений в языке 1С 8.3, 8.2 (в примерах) //helpme1c.ru
Бизнес-процессы
...
Задачи
...
Внешние источники данных
Внешние источники позволяют настроить соединение с источниками данных, для которых в системе установлены драйвера...
Временное хранилище
Информационная база 1С 8.x предоставляет программную возможность продолжительного хранения произвольных объектов вне всяких определенных прикладных типов во временном хранилище:
1 2 3 4 |
Адрес = ПоместитьВоВременноеХранилище(ОбъектДанных); ... ОбъектДанных = ПолучитьИзВременногоХранилища(Адрес); УдалитьИзВременногоХранилища(Адрес); |
Прочие дополнения
///.