Петр Желтоухов 11 октября 2021

👨‍💼 Освойте программирование в 1С за 60 минут: самоучитель для начинающих

Попробуйте себя в роли автоматизатора бизнес-процессов предприятия. На простом примере всего за час вы освоите базовые концепции программирования в 1С и поймете, что именно отличает «1С: Предприятие» от других систем разработки.
Вместо введения. Что такое “Платформа” и “Конфигурация”
Если вы только начинаете осваиваться в мире 1С: Предприятия, то можете услышать о некой “Платформе” и “Конфигурациях”, которые на ней разрабатываются. Это ключевое отличие системы разработки приложений 1С от других сред программирования. Например, веб-технологий, когда можно просто скачать/установить приложение и пользоваться им.

В 1С подход иной. Сначала вы приобретаете платформу 1С: Предприятие у фирмы “1С” или ее партнера. Затем покупаете одно из прикладных решений – конфигурацию. Ее вы можете использовать “как есть”, вносить свои доработки, чтобы адаптировать под специфику бизнеса, либо разработать собственную конфигурацию с нуля. Это похоже на прослушивание пластинок с помощью проигрывателя. Достаточно иметь одну платформу (проигрыватель) “1С: Предприятие”, – и можно разрабатывать или использовать любые конфигурации (пластинки), будь то “1С: Бухгалтерия предприятия”, “1С: Управление торговлей” или собственное решение. И также, как пластинка без проигрывателя – всего лишь кусок пластика, так и конфигурацией вы никак не сможете воспользоваться, не имея платформы 1С.

Разработка начинается с конфигуратора

В этой статье я исхожу из того, что у вас уже есть 1С-ка и вы используете для работы конфигурацию “Бухгалтерия предприятия”. После запуска 1С: Предприятия всегда сначала открывается Окно запуска 1С.

Рис. 1. Окно запуска 1С: Предприятия.
Рис. 1. Окно запуска 1С: Предприятия.

Кнопка “Конфигуратор” перенесет вас в среду разработки – главное окно конфигуратора. И первое, что необходимо сделать, – это открыть конфигурацию. Зайдите в меню “Конфигурация – Открыть конфигурацию” или нажмите соответствующую кнопку в панели инструментов, и дождитесь открытия окна дерева метаданных.

Итак, мы находимся в главном окне конфигуратора – рабочей среде программиста 1С. Давайте осмотримся на местности.

Рис. 2. Главное окно конфигуратора.
Рис. 2. Главное окно конфигуратора.

Верхняя часть окна – меню и панели инструментов – достаточно типичная и останавливаться на них не будем. О предназначении отдельных команд будем говорить по мере необходимости в их использовании.

Главный инструмент разработчика – это окно Конфигурация, открытое слева. Еще его называют дерево метаданных. Это описание всей структуры вашей базы, с указанием структуры каждого отдельного объекта, правил взаимодействий объектов между собой, настройками интерфейсов, прав доступа и много другого. Каждый элемент дерева имеет свою специфику использования и набор инструментов для работы с ним. Так, если дважды щелкнуть по любому справочнику или документу, то откроется окно редактирования объекта (рис. 3), а если выбрать в контекстном меню пункт Свойства, справа появится панель свойств текущего объекта. Это второй основной инструмент разработчика, с которым он взаимодействует чаще всего. На рисунке 4 представлен пример рабочей среды с открытой панелью свойств.

Рис. 3. Пример окна редактирования объекта метаданных.
Рис. 3. Пример окна редактирования объекта метаданных.
Рис. 4. Пример рабочей среды в процессе разработки.
Рис. 4. Пример рабочей среды в процессе разработки.

Задача на разработку: создание реестра счетов-фактур

У вас уже есть платформа 1С: Предприятие и установленная на ней конфигурация “1С: Бухгалтерия предприятия”. И теперь руководитель ставит перед вами задачу выполнить разработку нового функционала. В реальной жизни происходит примерно то же самое: на предприятии установлено некое типовое решение, но со временем появляется потребность адаптировать функционал конфигурации под специфику учета конкретного предприятия. Этим и займемся.

Ваша задача – разработать реестр счетов-фактур – вывести список документов, отобранный и отсортированный по определенным правилам.

Такая задача перед вами вряд ли встанет в процессе профессиональной деятельности, но в рамках настоящего самоучителя поможет сориентироваться в базовых подходах и познакомиться с основными приемами разработки на 1С.

Создание внешнего отчета

Существует три фундаментальных подхода к внесению доработок в 1С:

  • Внешние отчеты и обработки. Используются, как правило, для реализации разовых сервисных задач. Отчет/обработка – это отдельный внешний файл, который можно открыть в режиме использования 1С через меню Файл – Открыть и выполнить заложенную в него функцию. При этом сама конфигурация остается нетронутой;
  • Внесение изменений непосредственно в конфигурацию. Наиболее часто используемый подход при адаптации типовых решений. Конфигурация снимается с полной поддержки поставщика, и разработчик может вносить доработки непосредственно в объекты самой конфигурации. При этом появляется дополнительная необходимость в поддержке конфигурации при ее обновлении на новые версии поставщиком;
  • Разработка расширений. Это возможность расширить функционал конфигурации, не снимая ее с поддержки, с помощью дополнительно устанавливаемых “плагинов”, или “патчей”. Относительно молодая технология, которая стремительно набирает обороты и с каждой новой версией платформы предоставляет все больше возможностей.

Воспользуемся самым простым вариантом и создадим внешний отчет “Реестр счетов-фактур”. Для этого в меню “Файл” выбираем пункт “Новый” и создаем новый внешний отчет (рисунок 5).

В графе “Имя” напишите РеестрСчетовФактур, синоним будет присвоен автоматически, исправьте его на “Реестр счетов-фактур”. В поле “Форма отчета” нажмите кнопку открытия (с изображение лупы), откроется конструктор новой формы. Нажмите кнопку Готово, новая форма будет создана и открыта для редактирования.

Про имена и синонимы
Эти два свойства вы будете встречать практически везде: у объектов конфигурации, у подчиненных им объектов (форм, макетов и т.д.), у элементов формы, и… да везде. Сразу внесем ясность. Имя - это идентификатор объекта, который должен соответствовать определенным требованиям, например, начинаться с буквы и не иметь пробелов. По имени объекта к нему можно обращаться из языка программирования 1С. Синоним – это представление объекта для пользователя. Именно в таком виде он будет представлен в интерфейсе приложения. На строку синонима не накладывается никаких ограничений.
Рис. 5. Создание нового внешнего отчета.
Рис. 5. Создание нового внешнего отчета.
Рис. 6. Создание новой формы отчета.
Рис. 6. Создание новой формы отчета.

Редактор формы

Обзор редактора формы

Открывшийся редактор формы – это комплексный инструмент для разработки и программирования поведения формы. Состоит он из двух основных разделов: собственно редактора формы и модуля формы, где находится код на языке программирования 1С, отвечающий за поведение формы и взаимодействие с пользователем. Переключение между этими режимами осуществляется с помощью вкладок внизу окна редактора.

Рис. 7. Окно редактора формы.
Рис. 7. Окно редактора формы.

Визуальный редактор формы состоит из нескольких областей:

  • Область управления контентной частью формы (вверху справа). Отсюда начинается разработка формы – перечисляются реквизиты и команды, необходимые для размещения и управления информацией;
  • Область структуры элементов (вверху слева). Здесь находится перечень всех элементов формы и их структура размещения в виде дерева. Эта часть отвечает за то, как форма будет выглядеть, и за какие “ниточки” нужно потянуть, чтобы получить от нее желаемое поведение;
  • Область визуального представления (внизу). Представление того, какой эту форму будет видеть пользователь.

Для формирования реестра нам понадобится:

  • Выбор периода, за который формируется реестр;
  • Отбор по организации;
  • Кнопка формирования отчета;
  • Область вывода отчета.

Реквизиты формы

  • На вкладке “Реквизиты” создайте новый элемент, дайте ему имя ПериодОтчета и задайте тип СтандартныйПериод.
Рис. 8. Добавление реквизита “Период отчета”.
Рис. 8. Добавление реквизита “Период отчета”.
  • Теперь с помощью мыши перетащите новый реквизит в левую область, на вкладку Элементы. При этом период отобразится на форме в нижней части редактора.
  • Двойным щелчком по элементу откройте его свойства, и для свойства АвтоОтметкаНезаполненного укажите значение “Да”. Период на форме будет подчеркнут красным пунктиром, который появляется в случае, когда период не заполнен. Это – сигнал пользователю о том, что реквизит является обязательным, и без его заполнения отчет не сформируется.
  • Добавьте второй реквизит с именем Организация и типом СправочникСсылка.Организации. По аналогии разместите его на форме, только вместо свойства АвтоОтметкаНезаполненного установите свойство КнопкаОчистки в значение “Да”. У элемента Организация появится кнопка очистки в виде крестика. То есть, отчет можно будет сформировать как с отбором по определенной, выбранной, организации, так и с пустым значением этого поля. или по всем организациям базы данных.
Рис. 9. Новый реквизит и элемент формы Организация.
Рис. 9. Новый реквизит и элемент формы Организация.
  • И наконец добавьте третий реквизит формы ПолеОтчета с типом ТабличныйДокумент, разместите его на форме и установите свойство ПоложениеЗаголовка в значение “Нет”. В это поле мы и будем выводить наш отчет.
  • Чтобы проверить, как форма будет выглядеть для пользователя, нажмите кнопку Проверка в командной панели области элементов. Форма должна иметь вид, представленный на рисунке 10.
Рис. 10. Проверка формы.
Рис. 10. Проверка формы.

Основная компоновка формы завершена, но остался еще один важный элемент – кнопка, по нажатию на которую должно все произойти. Исправим этот недостаток.

Команды формы

Откройте вкладку Команды и создайте новый элемент. Задайте новой команде имя Сформировать, присвойте картинку СформироватьОтчет из библиотеки стандартных картинок, а свойству Отображение задайте значение “Картинка и текст”.

Рис. 11. Добавление команды “Сформировать отчет”.
Рис. 11. Добавление команды “Сформировать отчет”.

Чтобы разместить кнопку на форме, перетащите ее на элемент “Командная панель” во вкладке Элементы и включите для созданного элемента “Кнопка” свойство КнопкаПоУмолчанию. Отображение кнопки на форме вы сразу не увидите, это связано с тем, что по умолчанию главная командная панель формы отключена. Зайдите в панель свойств самой формы (корневой элемент “Форма” во вкладке Элементы), и для свойства ОтображениеКоманднойПанели установите значение “Авто”.

Рис. 12. Размещение основной кнопки в командной панели формы.
Рис. 12. Размещение основной кнопки в командной панели формы.

В завершение конструирования формы создадим обработчик для нашей команды. Обработчик связывает элемент формы – или какое-либо действие над элементом – с кодом программы.

Откройте панель свойств команды и рядом со свойством Действие нажмите кнопку открытия. Среди предложенных вариантов обработчиков выберите “Создать на клиенте и процедуру на сервере” и нажмите ОК. После этого активируется редактор модуля формы, где уже заготовлена процедура для реализации алгоритма действия команды.

Рис. 13. Создание обработчика команды в модуле формы.
Рис. 13. Создание обработчика команды в модуле формы.

Проверка формы в режиме “1С: Предприятие”

Преимущество разработки внешних отчетов – это возможность быстро посмотреть результат работы в “боевом” режиме. Для этого достаточно только сохранить новые изменения в файле, без необходимости обновлять и перезапусткать информационную базу.

Сохраните результаты своей работы (меню Файл – Сохранить). Файл внешнего отчета 1С имеет расширение .erf.

Запустите “Бухгалтерию предприятия” в пользовательском режиме, если она еще не запущена. Сделать это можно прямо из конфигуратора, через меню Сервис – 1С: Предприятие. В открывшемся окне информационной базы зайдите в главное меню, выберите пункт Файл – Открыть… и откройте ваш внешний отчет. Сейчас можно проверить, как работает выбор периода и организации.

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

Рис. 14. Пользовательский режим информационной базы.
Рис. 14. Пользовательский режим информационной базы.

Ваш первый код: собираем данные для отчета

Приступим к написанию кода на языке программирования 1С. Язык этот не сложный, в нем нет строгой типизации и он полностью русифицирован.

Редактирование кода формы происходит в модуле формы, которая находится на вкладке Модуль окна редактора формы. Здесь уже создана основа обработчика для кнопки “Сформировать”.

Клиент-серверное программирование логики

Архитектура приложений 1С подразумевает под собой клиент-серверную природу взаимодействия. При установке ПО платформа 1С многое берет на себя, но при разработке конфигураций на разработчика возлагается ответственность за клиент-серверную логику кода, в частности в модуле формы. Необходимо понимать, какие методы и операции доступны только на клиентской стороне, а какие необходимо исполнять на сервере.

Как видно на рисунке 13, для разделения контекста выполнения процедуры используются директивы компиляции перед объявлением метода, начинающиеся с символа "&". Обработчики событий элементов формы активируются на стороне клиента. В нашем случае это процедура Сформировать(), в которой мы опишем проверку заполнения реквизитов формы и выдачу предупреждения пользователю. Здесь же вызывается серверная процедура СформироватьНаСервере(), в которой уже будем работать с данными таблиц базы, поскольку эти данные с клиента недоступны. Именно с этой целью на этапе создания обработчика мы выбрали вариант создания на клиенте с процедурой на сервере.

Первый код процедур

Напишите код клиентской процедуры Сформировать(), как показано ниже:

        &НаКлиенте
Процедура Сформировать(Команда)
	
	Если НЕ ЗначениеЗаполнено(ПериодОтчета.ДатаНачала)
		ИЛИ НЕ ЗначениеЗаполнено(ПериодОтчета.ДатаОкончания) Тогда
		
		ПоказатьПредупреждение(, "Не заполнен период отчета.", , "Ошибка");
		Возврат;
		
	КонецЕсли;
	
	СформироватьНаСервере();
	
КонецПроцедуры

    

Если коротко, то здесь выполняется проверка на заполнение периода отчета на форме, и, если период не заполнен, то выводится предупреждение, и дальнейшее выполнение команды прекращается.

Теперь немного по конструкциям языка:

  • Каждая команда языка заканчивается точкой с запятой;
  • В одной строке может быть более одной команды, разделенных точкой с запятой;
  • Одна команда может располагаться на нескольких строках, отдельные части можно разделять произвольным числом пробелов, табуляций и переносов строк.

Проверка условий в 1С выполняется с использованием ключевых слов Если… Тогда… КонецЕсли. В общем случае синтаксис условия такой:

        Если <условие> Тогда
    // код при выполнении <условие>. Так, кстати, пишутся комментарии в коде
ИначеЕсли <альтернативное условие> Тогда
    // код при выполнении <альтернативное условие>
Иначе
    // код при невыполнении ни одного условия
КонецЕсли;

    
  • Булева логика условий строится с использованием ключевых слов И,ИЛИ, НЕ.
  • Обращение к реквизиту формы (ПериодОтчетав нашем примере) выполняется простым указанием имени реквизита.
  • Специализированный тип данных СтандартныйПериод – это конструкция со свойствами ДатаНачала и ДатаОкончания, обращение к которым производится через точку.
  • Проверку на заполнение значения переменной выполняем с помощью универсальной функции глобального контекста ЗначениеЗаполнено().
  • Еще одна функция языка ПоказатьПредупреждение() отвечает за интерактивную выдачу предупреждения пользователю.
Рис. 15. Предупреждение пользователя.
Рис. 15. Предупреждение пользователя.
  • Ключевое слово Возврат выполняет безусловный выход из процедуры, прекращая выполнение всего последующего кода этой процедуры.
  • В серверной процедуре СформироватьНаСервере() будем выполнять обход всех документов вида “Счет-фактура выданный” за указанный период. Для обращения к коллекции документов платформы используется ключевое слово Документы, и через точку указывается вид документа так, как он задан в дереве метаданных. Кстати, перенести любой идентификатор из дерева метаданных в код модуля можно простым перетаскиванием мышью.

Код нашей серверной процедуры будет выглядеть следующим образом:

        &НаСервере
Процедура СформироватьНаСервере()
	
	ДатаС = ПериодОтчета.ДатаНачала; // Объявление новой переменной
	ДатаПо = ПериодОтчета.ДатаОкончания;
	
	// Открытие выборки документов за период, с сортировкой по дате
	Выборка = Документы.СчетФактураВыданный.Выбрать(ДатаС, ДатаПо, , "Дата");
	
	// Обход выборки в цикле
	Пока Выборка.Следующий() Цикл
		
		// Проверка отбора по организации
		// и сравнение реквизита формы с реквизитом документа
		Если ЗначениеЗаполнено(Организация)
			И Выборка.Организация <> Организация Тогда
			Продолжить; // Уходим на следующую итерацию, игнорируя тело цикла
		КонецЕсли;
		
		// ...
		// Обработка очередного документа
		// ...
		
	КонецЦикла;
	
КонецПроцедуры

    

Думаю, назначение отдельных конструкций и команд понятно из комментариев.

Синтакс-помощник – путеводитель по языку программирования

Сам язык программирования 1С довольно простой, да мы по сути и разобрали его основной синтаксис. Гораздо больше в себе таит многообразие прикладных и специализированных конструкций, сориентироваться в которых на первых порах может быть непросто.

К счастью. в платформе 1С есть палочка-выручалочка программиста – синтакс-помощник, который открывается из меню Справка – Синтакс-помощник. А если интересует справка по конкретному методу, то встаньте на него в коде модуля и нажмите сочетание клавиш Ctrl+F1. Синтакс-помощник откроется на статье с описанием этого метода.

Рис. 16. Получение справки по функции Следующий() в синтакс-помощнике.
Рис. 16. Получение справки по функции Следующий() в синтакс-помощнике.

А как отчет будет выглядеть? Знакомимся с макетом

Для формирования визуального представления отчета в 1С используется специальный объект Макет, который содержит шаблоны отдельных составляющих будущего отчета. Из этих шаблонов, или областей макета, посредством программного кода, отчет собирается с помощью специализированного объекта языка программирования ТабличныйДокумент.

Рис. 17. Создание макета отчета.
Рис. 17. Создание макета отчета.
  • Из основного окна внешнего отчета, на ветке структуры Макеты вызовите команду “Добавить” контекстного меню. Откроется Конструктор макета, в котором укажите имя “Реестр” и оставьте тип “Табличный документ”. После нажатия кнопки “Готово” откроется пустой макет, похожий на таблицу MS Excel.
  • Работа с ячейками таблицы макета не должна вызвать затруднений, все настройки параметров и свойств выполняются все в той же Панели свойств.
  • В первой ячейке первой строки напишите заголовок отчета “Реестр счетов-фактур”. Увеличьте шрифт и задайте полужирное начертание.
  • В третьей строке дайте заголовки таблицы реестра в каждой отдельной ячейке столбца, в порядке: Дата, Номер, Контрагент, Сумма. Установите полужирное начертание и обведите контуры ячеек сплошной линией (рис. 18). Если выделить диапазон ячеек, то свойства можно менять для всех ячеек сразу.
Рис. 18. Настройка ячеек макета.
Рис. 18. Настройка ячеек макета.
  • Теперь выделим оформленную шапку реестра в отдельную область, чтобы можно было к ней обращаться из кода программы. Для этого выделите строки шапки и нажмите кнопку Назначить имя в панели инструментов редактора макета. Задайте для области имя Шапка.
Рис. 19. Создание области макета.
Рис. 19. Создание области макета.
  • Аналогично, четвертую строку выделите в отдельную область “Строка”, заполните ячейки строки теми же именами: Дата, Номер, Контрагент, Сумма. Установите свойство Заполнение этих ячеек в значение “Параметр”. Тем самым мы определили для области макета собственные параметры-ячейки, которые становятся доступны для заполнения из программного кода.

Внешний вид ячеек строки настройте на свое усмотрение. Для указания правил отображения даты и суммы используйте свойство Формат.

Рис. 20. Готовый макет реестра.
Рис. 20. Готовый макет реестра.

Выводим данные в табличный документ

Как я уже упоминал выше, для программного формирования отчета мы будем использовать специализированный объект языка программирования 1С ТабличныйДокумент. Объявим его создание в начале нашей процедуры и сохраним в отдельную переменную:

        ТабДок = Новый ТабличныйДокумент;
    

Для чтения данных из макета “Реестр” необходимо сначала получить программный объект этого макета:

        ЭтотОтчет = РеквизитФормыВЗначение("Отчет");
Макет = ЭтотОтчет.ПолучитьМакет("Реестр");
    

Теперь в переменной Макет находится объект макета, через который можно обращаться к отдельным областям и параметрам. Получение и вывод шапки в отчет выполняют следующие команды:

        ОбластьШапка = Макет.ПолучитьОбласть("Шапка"); // Объявляем переменную области макета
ТабДок.Вывести(ОбластьШапка); // Выводим область в табличный документ
    

Далее, в цикле выводим данные документа в строку, предварительно заполнив параметры через свойство области Параметры:

        // Выводим очередной документ в строку реестра
ОбластьСтрока.Параметры.Дата = Выборка.Дата;
ОбластьСтрока.Параметры.Номер = Выборка.Номер;
ОбластьСтрока.Параметры.Контрагент = Выборка.Контрагент;
ОбластьСтрока.Параметры.Сумма = Выборка.Сумма;

ТабДок.Вывести(ОбластьСтрока);
    

После завершения алгоритма переменная ТабДок содержит сформированную печатную форму, которую теперь можно представить пользователю. С этой целью мы создали на форме элемент ПолеОтчета. Присвоим полученный табличный документ реквизиту формы:

        ПолеОтчета = ТабДок;
    

Полный текст процедуры:

        &НаСервере
Процедура СформироватьНаСервере()
	
	ТабДок = Новый ТабличныйДокумент;
	
	ДатаС = ПериодОтчета.ДатаНачала;
	ДатаПо = ПериодОтчета.ДатаОкончания;
	
	Выборка = Документы.СчетФактураВыданный.Выбрать(ДатаС, ДатаПо, , "Дата");
	
	ЭтотОтчет = РеквизитФормыВЗначение("Отчет");
	Макет = ЭтотОтчет.ПолучитьМакет("Реестр");
	
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
	ТабДок.Вывести(ОбластьШапка);
	
	ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
	
	Пока Выборка.Следующий() Цикл
		
		Если ЗначениеЗаполнено(Организация)
			И Выборка.Организация <> Организация Тогда
			Продолжить;
		КонецЕсли;
		
		ОбластьСтрока.Параметры.Дата = Выборка.Дата;
		ОбластьСтрока.Параметры.Номер = Выборка.Номер;
		ОбластьСтрока.Параметры.Контрагент = Выборка.Контрагент;
		ОбластьСтрока.Параметры.Сумма = Выборка.Сумма;
		
		ТабДок.Вывести(ОбластьСтрока);
		
	КонецЦикла;
	
	ПолеОтчета = ТабДок;
	
КонецПроцедуры

    

Сохраните изменения во внешнем отчете и проверьте его работу в пользовательском режиме.

Рис. 21 Готовый отчет
Рис. 21 Готовый отчет

Итоги

Поздравляю! Ваш первый отчет на 1С готов. За этот час вы освоили довольно много материала:

  • Познакомились с конфигуратором 1С: Предприятия;
  • Создали новый внешний отчет;
  • Освоили работу в редакторе формы;
  • Разработали макет печатной формы;
  • Научились получать данные документов, обрабатывать действия пользователя, работать с макетом и табличным документом с помощью языка программирования 1С.
Конечно, в каждой из затронутых нами тем еще есть куда копнуть. Это и язык запросов для структурированного получения данных из базы, и СКД для построения отчетов, и универсальные коллекции языка программирования, которые обогащают работу с ним.

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

***

Если вы только собираетесь освоить платформу и хотите заниматься с практикующими профессионалами по систематизированной программе, обратите внимание на Факультет 1С-разработки от GeekBrains. Курс подойдет как начинающим программистам, так и пользователям системы 1С.

Всего за 8 месяцев вы научитесь разрабатывать конфигурации, сможете делать отчеты, обрабатывать информацию и конфигурировать ее. Овладеете грамотным составлением ТЗ, разберете реальные задачи, попрактикуетесь в создании кейсов. Вас подготовят вас к экзаменам «1С: Профессионал» и «1С: Специалист», а опытные HR-менеджеры помогут составить резюме и найти первую работу. Успешно завершившие курс студенты добавят в портфолио несколько кейсов и получат диплом о профессиональной переподготовке.

Онлайн-платформа гарантирует ваше трудоустройство после получения сертификата и сдачи экзамена.

МЕРОПРИЯТИЯ

Комментарии

ВАКАНСИИ

Добавить вакансию

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ