Сегодня 22 апреля 2022 года 11 часов 43 минуты, +9
Всем доброго дня!
Решил поделиться опытом технических собеседований.
Должен отметить, что правильные ответы на все вопросы, как в ЕГЭ, известны исключительно вопрошаемому.
Необходимо четко понимать уровень человека, который вас экзаменует и плюс-минус понимать какой ответ от вас ожидают услышать.
Таким образом, прохождение технического интервью превращается, практически, в искусство психологического анализа.
Должен сразу отметить, что не следует сильно углубляться в технические тонкости если от вас этого не ожидают.
Один из важных разделов - это управляемые формы.
Управляемые формы
Не часто встречается такой вопрос, но его могут задать:
Что такое управляемые формы?
достаточно ответа, что управляемые формы - это формы, которые находятся под управлением виртуальной машины платформы.
далее следует вполне закономерный вопрос:
Зачем придумали управляемые формы?
облегчают процесс разработки форм, оптимизация работы форм за счет клиент-серверного взаимодействия
Могут быть вопросы чисто прикладные:
Как передать файл с клиента на сервер?
для передачи файла на сервер используется временное хранилище. причем на сервер передается строковое значение с адресом во временном хранилище
Как передать таблицу с сервера на клиент?
было достаточно ответа, что через массив
Но существуют и другие способы.
Как выполнить экспортную процедуру из модуля объекта?
ДокОбъект = РеквизитФормыВЗначение("Объект"); ДокОбъект.ЭкспортнаяПроцедура();
Как лучше получать значение реквизита на форме?
во первых, тут про клиент - серверное взаимодействие.
На клиенте доступны только реквизиты формы.
Возникает мысль получения на сервере, да еще миную точку, то бишь запросом.
В платформе реализована возможность получения реквизитов объекта на клиенте. По факту идет обращение к серверу, но полученные данные кэшируются и следующее обращение обращается уже к кэшу.
Если получать данные на сервере, то постоянно будет обращение к серверу. Поэтому ответ лучше получать данные на клиенте использую механизмы платформы получения значения реквизитов
Какие директивы компиляции вы знаете?
&НаКлиенте
&НаСервере
&НаСервереБезКонтекста
&НаКлиентеНаСервереБезКонтекста
&НаКлиентеНаСервере
Чем они отличаются?
&НаКлиенте – данный метод будет выполняться в клиентском контексте. Это значит, что он будет выполняться на той машине, где в данный момент функционирует клиентское приложение.
&НаСервере — код процедуры или функции под этой директивой будет выполняться в серверном контексте, т.е. на машине, где запущен сервер 1С. Все данные формы будут передаваться на сервер, а потом обратно на форму, после завершения выполнения метода. Из процедуры под этой директивой будет доступен весь серверный контекст формы, т.е. все процедуры или функции, которые выполняются на сервере, можно вызвать из метода предваренного этой директивой.
&НаСервереБезКонтекста — код процедуры или функции под этой директивой как и в случае с директивой &НаСервере будет выполняться в серверном контексте, т.е. на машине, где запущен сервер 1С. Но в отличие от серверного вызова методов, при внеконтекстном серверном вызове, данные формы не будут передаваться на сервер.
Чаще всего применяются эти три директивы (выше)
&НаКлиентеНаСервереБезКонтекста необходима, если требуется выполнение процедуры/функции и на сервере и на клиенте. Данная директива используется редко, но является полезной и позволяет вместо двух процедур, для выполнения в разных контекстах, указать всего одну.
&НаКлиентеНаСервере по сути аналогична &НаКлиентеНаСервереБезКонтекста, но доступна она только в модуле команд.
Если по ошибке не указать директиву, то платформа сама ее поставит. По умолчанию это директива &НаСервере.
В какой процедуре лучше заполнять реквизиты формы "ПриСозданииНаСервере" или "ПриОткрытии"?
ПриСозданииНаСервере
Были и вопросы на знание конкретных процедур и функций работы с формами, в том числе и из БСП, но тут уже зависит от уровня руководителя и что он недавно открыл для себя и теперь считает, что это должен знать каждый кандидат.
Далее хотелось бы остановиться подробнее. Вопрос прозвучал на собеседовании в одной из государственных контор. Почему-то я пользуюсь у них популярностью. Наверное, из-за ценника.
Исходя из многочисленных собеседований с госконторами, должен отметить, что уровень их руководителей довольно посредственный, но они очень высокого о себе мнения.
Категорически запрещается блистать знаниями более углубленными, чем у самого руководителя.
В данном случае следует использовать наставление Петра 1: "Подчиненный перед лицом начальствующим должен иметь вид лихой и придурковатый, дабы разумением своим не смущать начальство".
У последней госконторки имеется своя "нетленка" размером в 9 терабайт разработанная еще в 2008 году и успешно дорабатываемая по сей день.
Она давно не на поддержке и они считают свою конфигурацию уникальной и неповторимой. Штат программистов, как я понял не менее 40 программистов своих, плюс внешние подрядчики.
Так вот у этих "лидеров рынка" довольно интересная ситуация: часть объектов на обычных формах, часть на управляемых. Стремятся перевести все на управляемые. Но до сих пор работают в режиме толстого клиента с поддержкой обычных форм. Платформа порядка 8.3.14. Собираются переходить на 8.3.20.
На мой вопрос почему именно на 8.3.20 получил ответ, что последняя. На что я заметил, что к 8.3.20 достаточно нареканий (учитывая наличие обычных форм) и порекомендовал 8.3.19 как наиболее устойчивую исходя из рекомендаций других пользователей и собственных тестов платформ.
Видимо, уже этим я перебежал дорожку одному из великих экспертов госконторки.
Так вот следующий вопрос явно был очень насущный:
Как задать вопрос пользователю на клиенте?
вопрос отсылает к синхронным вызовам на обычной форме с открытием модального окна.
Воспользуемся информацией.
Синхронный и асинхронный вызов в новых версиях платформы
Вот так это выглядит на обычных формах:
Процедура СинхронныйВызов(Команда)
Ответы = Новый СписокЗначений;
Ответы.Добавить("Ответ1");
Ответы.Добавить("Ответ2");
Ответ = Вопрос("Ваш ответ?", Ответы);
ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
Если Ответ = "Ответ2" Тогда ОбщегоНазначенияКлиент.СообщитьПользователю("Верно"); Иначе ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно"); КонецЕсли;
КонецПроцедуры
На управляемых формах с отключенным открытием модальных окон это довольно проблематично.
На управляемых формах это может выглядеть так:
&НаКлиенте
Процедура АсинхронныйВызов(Команда)
Ответы = Новый СписокЗначений;
Ответы.Добавить("Ответ1"); Ответы.Добавить("Ответ2");
ОписаниеОповещения = Новый ОписаниеОповещения("АсинхронныйВызовЗавершение", ЭтотОбъект);
ПоказатьВопрос(ОписаниеОповещения, "Ваш ответ?", Ответы);
ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа"); КонецПроцедуры
&НаКлиенте
Процедура АсинхронныйВызовЗавершение(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ = "Ответ2" Тогда ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
Иначе
ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно"); КонецЕсли;
КонецПроцедуры
Таким образом, ответа, что для этого используется описание оповещения для них достаточно
Но, если углубляться, то можно узнать, что начиная с платформы 8.3.18.1128 переработана технология работы с асинхронными вызовами.
появилась новая функция асинхронного вызова
Функция - ВопросАсинх возвращает ответ нового типа - Обещание:
&НаКлиенте
Асинх Процедура АсинхВызов(Команда)
Ответы = Новый СписокЗначений;
Ответы.Добавить("Ответ1");
Ответы.Добавить("Ответ2");
ОтветАсинх = ВопросАсинх("Ваш ответ?", Ответы);
ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа"); Ответ = Ждать ОтветАсинх;
Если Ответ = "Ответ2" Тогда ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
Иначе
ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно"); КонецЕсли;
КонецПроцедуры
Сама процедура имеет признак - Асинх.
С управляемыми формами вроде охватил большинство вопросов.
#ведущий программист 1с #управляемые формы #директивы компиляции #Клиент #сервер