При получении первого тестового задания у начинающего разработчика 1С часто возникает вопрос: сколько времени должна занимать такая работа и на какие технические нюансы стоит обратить внимание? В данной статье мы подробно разберем структуру типичного задания на создание системы учета карт лояльности, проанализируем подходы к реализации и определим адекватные сроки выполнения.
Типовое задание включает в себя создание справочников, регистров и веб-сервиса. Опытные специалисты оценивают «чистое» время кодинга в пустой конфигурации в 2–4 часа. Однако, если учитывать необходимость отладки, публикации веб-сервиса на локальном сервере (IIS или Apache) и возможные неточности в постановке задачи, реалистичный срок для качественного выполнения — от 8 до 16 рабочих часов. Разберем по шагам, как реализовать каждый пункт задания наиболее профессионально.
Первым делом создадим справочник КартыЛояльности. Помимо стандартных реквизитов Код и Наименование, добавим Штрихкод (тип Число(17, 0)) и Фото (тип ХранилищеЗначений).
Рассмотрим подробнее механизм отображения фотографии на управляемой форме. Напрямую отобразить данные из реквизита типа ХранилищеЗначений нельзя. Нам потребуется создать реквизит формы с типом Строка (в котором будет храниться адрес во временном хранилище) и связать его с элементом формы типа «Поле картинки».
Проанализируем программный код для вывода фото при открытии элемента:
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Получаем навигационную ссылку на данные в хранилище
АдресФото = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "Фото");
КонецПроцедуры
Если же мы хотим загружать новое фото, воспользуемся методом ПоместитьФайл на клиенте, а затем на сервере запишем полученный адрес в ХранилищеЗначений.
Справочник ДержателиКартЛояльности содержит поле Баллы, которое не должно быть реквизитом базы данных. Это проверяет наше умение работать с динамическим расчетом данных на форме.
Выясним, как лучше собрать строку баллов по всем картам владельца. Для этого в событии формы ПриСозданииНаСервере или ПриЧтенииНаСервере необходимо выполнить запрос к регистру накопления (который мы создадим позже). Результат запроса нужно обойти в цикле и соединить через точку с запятой.
Пример логики сбора строки баллов:
&НаСервере
Процедура ЗаполнитьИнформациюОБаллах()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| БаллыЛояльностиОстатки.КоличествоОстаток КАК Баллы
|ИЗ
| РегистрНакопления.БаллыЛояльности.Остатки(, Карта В (ВЫБРАТЬ Карта ИЗ РегистрСведений.СвязиКартГдеВладелец = &Владелец)) КАК БаллыЛояльностиОстатки";
Запрос.УстановитьПараметр("Владелец", Объект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
РезультатСтрокой = "";
Пока Выборка.Следующий() Цикл
РезультатСтрокой = РезультатСтрокой + ?(РезультатСтрокой = "", "", "; ") + Строка(Выборка.Баллы);
КонецЦикла;
ЭтаФорма.ПолеБаллы = РезультатСтрокой;
КонецПроцедуры
По условию задачи, у карты могут быть разные владельцы в зависимости от периода. Это однозначно указывает на необходимость использования периодического регистра сведений. Создадим регистр СвязиКартИДержателей с периодичностью «В пределах дня» или «Секунды».
Структура регистра:
Карта (тип СправочникСсылка.КартыЛояльности).Держатель (тип СправочникСсылка.ДержателиКартЛояльности).ДатаПолучения, ДатаЛиквидации.Важно помнить: чтобы получить актуального владельца на текущий момент, мы всегда должны обращаться к виртуальной таблице СрезПоследних. Это гарантирует корректную работу логики даже при смене владельца карты.
Регистр накопления БаллыЛояльности (вид «Остатки») необходим для учета баланса баллов. Однако в 1С данные в регистр накопления не могут попасть «сами по себе» — для этого нужны документы-регистраторы.
Разберем, какие документы стоит добавить для полноценного теста:
В архитектуре решения можно обойтись одним универсальным документом КорректировкаБаллов, но наличие специализированных документов покажет проверяющему ваше понимание бизнес-логики учета.
Создание веб-сервиса — это этап, требующий настройки внешнего окружения. Рассмотрим пошагово процесс реализации метода GetPoints, который принимает штрихкод и возвращает остаток баллов.
1. Создание XDTO-пакета. Сначала опишем типы данных. Создадим пакет (например, LoyaltyTypes), в котором определим тип возвращаемого значения (строка).
2. Создание объекта «Веб-сервис». В ветке «Общие» создаем новый веб-сервис LoyaltyService. Указываем пространство имен и выбираем наш XDTO-пакет. Добавляем метод GetPoints с входным параметром Barcode.
3. Программная логика метода:
Функция GetPoints(Barcode)
// Ищем карту по штрихкоду
СсылкаНаКарту = Справочники.КартыЛояльности.НайтиПоРеквизиту("Штрихкод", Barcode);
Если СсылкаНаКарту.Пустая() Тогда
Возврат "Карта не найдена";
КонецЕсли;
// Получаем остаток баллов из регистра
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(БаллыЛояльностиОстатки.КоличествоОстаток) КАК Остаток
|ИЗ
| РегистрНакопления.БаллыЛояльности.Остатки(, Карта = &Карта) КАК БаллыЛояльностиОстатки";
Запрос.УстановитьПараметр("Карта", СсылкаНаКарту);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Строка(Выборка.Остаток);
Иначе
Возврат "0";
КонецЕсли;
КонецФункции
4. Публикация. Чтобы сервис стал доступен, необходимо через меню «Администрирование -> Публикация на веб-сервере» опубликовать информационную базу. Не забудьте установить галочку «Публиковать веб-сервисы».
Проанализируем типичные подводные камни, которые могут снизить оценку за выполнение задания:
Важный совет: хотя само программирование может занять мало времени, потратьте дополнительные 30 минут на «наведение красоты». Проверьте синонимы объектов, настройте удобные формы списков и добавьте несколько тестовых записей в базу. Это продемонстрирует вашу заботу о конечном пользователе и профессиональный подход к разработке.