Теперь можно открыть ещё одну занавесь. В прошлом уроке я сказал, что модули условно видны. Всё дело в том, что современное программирование всё более тесно связано с так называемой клиент-серверной моделью. Об этом я рассказываю ТУТ. В этом смысле 1С не исключение, по этому программист должен понять, какая часть его кода будет работать у пользователя на его персональном компьютере и какая часть кода будет работать на сервере. По этому, если вы делаете общий модуль, процедуры и функции которого будут общими для каких-то задач из разных областей вашей конфигурации, вы должны заранее определить будет этот модуль виден на клиенте, на сервере или и там и там. Однако, вы должны понимать, что все модули, которые имеют в своём определении “на клиенте”, будут выгружаться в пользовательскую среду на каждый компьютер, и это должно быть действительно оправдано с точки зрения оптимизации системы. В тоже время определение модуля “на сервере” тоже должно быть оправдано, чтобы пользовательский клиентский компьютер не гнал лишний траффик, например, только для того чтобы взять часть строки, выполняя это на сервере. Например следующий код:
Функция ПолучитьЛевыйСимволИзСтроки(НекаяСтрока)
Возврат Лев(НекаяСтрока, 1);
КонецФункции
Этот код совершенно нерационально делать на сервере, если вы будете вызывать его только с клиента. Однако, если и на сервере вам придётся выполнять эту функцию, то у вас не будет иного варианта, как сделать её на сервере, т.к. серверный код не может выполнять код, если он определен только как клиентский. Есть вариант конечно же и ещё третий вариант, но рациональность его условна и действует только в определенных случаях – это разместить в двух разных модулях (в серверном и клиентском) этот одинаковый код.
А вот такой код никогда не получится выполнить на клиенте:
Функция ПолучитьЛевыйСимволИзСтроки(НекаяСтрока)
Запрос = Новый Запрос;
// Как-то обрабатываем сам запрос или его результат
КонецФункции
И проблема здесь лишь одна – объект “Запрос” невозможно создать на клиенте, т.к. на клиентском компьютере нет возможности напрямую работать с базой данных.
Но это всё хорошо и красиво звучит в теории, а что с практикой, вы резонно можете сказать,- Автор, дай пример, где это использовать в нашей конфигурации, которую мы уже 7-й урок делаем!- Да пожалуйста!- ответил я.- Помните как мы считали сумму по строке в формах документов поступления товаров и реализации товаров? А делали мы это так:
Кстати, вы наверно внимательный слушатель курса и по этому заметили, что в модуле формы есть перед каждой процедурой и функцией ключевые слова “&НаКлиенте”, “&НаСервере”, а например, в модуле проведения документов их нет нигде. Всё дело в том, что в форме можно выполнять как клиентский код, так и серверный, только нужно сказать точно, где будет располагаться ваша процедура или функция, а в модуле объекта все пользовательские функции и процедуры выполняются на сервере.
Тут нужно сразу сказать, что всё не так однозначно. В серверных модулях 1С можно выполнить такую 100% клиентскую процедуру, как вывести сообщение пользователю. Не знаю точно, но это наверно единственная клиентская процедура, которую сервер транспортирует на клиента, причём только на того, который её исполняет. Т.е. если сделать вот так:
То будет вот так (всё нормально работает):
Так вот, отвлеклись, а теперь возвращаемся далее к коду. Мы видим, что эта процедура встречается в трёх видах документов – поступление мелочёвки, поступление товаров и услуг и реализации товаров и услуг. Эта процедура одинаковая для всех этих видов документа, так спрашивается, зачем нам её создавать аж три раза, если можно сделать одну в каком-нибудь общем модуле. Давайте так и сделаем. Кликните там, где я показывал это уже ранее и создайте новый общий модуль и при помощи ПКМ вызовите его свойства. Дайте ему имя “ОбщиеПроцедурыИФункцииКлиент” и укажите область видимости “Клиент”:
Флажка “Сервер” наоборот быть не должно, т.к. в нашей этой процедуре есть чисто клиентский объект формы, который так и называется “Объект” и гнать его на сервер не нужно (на сервере мы не будем как-то использовать форму объекта, да и не получится это сделать). Если вы всё же попытаетесь передать серверу то, что должно существовать как объект только на клиенте, то получите что-то вроде этого:
Т.е. в ошибке значится, что невозможно воспроизвести объект клиентской формы на сервере ввиду отсутствия такой возможности; но оно и понятно – кому на сервере форму показывать, соседним лампочкам в дата-центре? ))
Скопируем нашу процедуру из документа и вставим её в этом модуле:
Теперь её нужно немного доработать. Во первых, продолжение к разговору об условной видимости. В таком виде процедура не будет видна только из этого же модуля. Откуда-нибудь из другого места, из формы, из другого модуля, хоть на клиенте, хоть где, эта процедура будет невидимой. Чтобы она стала видимой нужно сделать вот так:
Т.е. обозначить её как экспортную процедуру. Это волшебное слово сразу сделает её видимой из любого клиентского модуля. Подчёркиваю – именно клиентского, т.к. мы в самом модуле флажок поставили только у области расположения “Клиент”.
Так, дорабатываем дальше. Дело в том, что в общем модуле платформа совершенно не понимает такие объекты как Элементы и Объект. Это свойства формы, а процедура в модуле абстрагирована от какого-либо объекта кроме самой конфигурации. По этому ссылку на объект формы нужно передать как параметр и кое-что поменять:
Как видите, я фактически только добавил параметр (в круглых скобках) и в трёх местах сделал родительский объект. Т.е. сказал платформе,- “Элементы” и “Объект” – это не самостоятельные свойства непойми чего, а это свойства объекта ОбъектФормы, переданного в качестве параметра.
Сам модуль формы тоже изменим до вот такого вида (эта процедура в этом модуле формы больше нам не нужна, теперь есть общая):
Перезапустим и проверим. Для того чтобы полностью убедиться в праведности нашего пути, закройте рабочую среду, поставьте курсор на указанную ниже строку и нажмите функциональную кнопку F9. Должна слева в этой строке на полях появиться вот такая вот здоровенная точка:
Теперь запустите 1С. НО(!!!!) не как обычно, а вот так:
После этого запустится казало бы самая обычная среда, но только она будем отлавливать момент, пока функционал тем или иным образом не окажется в этой отмеченной строке. После этого платформа 1С поставит на паузу все свои действия и переведет указатель. Для того чтобы выполнение оказалось тут, что нужно сделать?- Правильно, зайти в документ поступления товаров и стереть с количества товара число и поставить его же снова (ну это как бы мы таким образом число поменяли на другое, для системы это всё равно событие изменение реквизита). Как только введете ENTER или кликните по другому полю, платформа 1С автоматически возвратит вас в конфигуратор (не закрывая рабочей среды, а только приостановив его) на эту самую строку, и стрелкой поверх нашего кружка укажет это:
Это будет означать, что выполнение программы действительно оказалось именно здесь. Там мы совершенно случайно познакомились ещё и с таким мощным инструментом 1С, как отладка. Теперь можно продолжить всё-таки доделать программе и завершить самой алгоритм, для этого нужно нажать функциональную клавишу F5, либо прямо прервать работу рабочей среды (ну мало ли мы что-то страшное написали и во чтобы то ни стало нужно всё остановить), тут надо будет пойти в меню, либо нажать Shift+F5:
Кстати, продолжить выполнять можно и по одному выражению, для этого нужно воспользоваться клавишами F10 и F11 (это тоже как и F10, только будет “входить” внутрь вызываемых процедур и функций,- тут проще сравнить и посмотреть разницу между ними воочию, чем долго объяснять)) ).
Теперь, когда мы знаем что такое отладка, давайте добавим в документ поступления товаров и услуг ещё два стандартные процедуры – ПередЗаписью и ПриЗаписи:
Поставьте в конце каждой процедуры точку останова, запустите рабочую среду в режиме отладки на нажмите кнопку “Провести и закрыть”. Нажимая F5, посмотрите внимательно по каким точкам и в какой последовательности будет выполняться функционал – сначала вызывается процедура ПередЗаписью, затем ПослеЗаписи и только лишь после этого ОбработкаПроведения:
В такой последовательности проводятся все документы 1С, это специфика платформы. Кстати у справочников почти также, только у них нет возможности проведения и соответственно процедуры проведения, но ПередЗаписью и ПриЗаписи – есть. Из названия самих процедур можно узнать, что одно происходит до того как изменения объекта оказались в базе данных 1С, второе как раз после этого, но до проведения, а третье вызывается, когда уже с документом произведено всё, что касается записи, и теперь нужно сделать всё, что касаемо проведения.
Теперь немного коснёмся пользовательского интерфейса, т.е. того с чем пользователь взаимодействует. Опять возвращаемся к нашей сумме по строке в документах. Всё с ней вроде неплохо, кроме одного – сумма сейчас доступна для редактирования; взял, случайно кликнул туда уже после того как она посчитана и получится вот так:
Ну вот как такое может быть?- 3 на 1500 равно двум…Это не дело, хорошо бы сделать так, чтобы поле это было заблокировано от ввода данных. Сначала для этого нужно в графическом представлении формы вызвать свойство этого реквизита, запрятано это вот туда:
А реквизита за блокировку аж два:
Отключение доступности блокирует реквизит полностью и от копирования и изменения, а свойство “ТолькоПросмотр” блокирует реквизит только от изменения. В нашем случае более правильным будет указать, что реквизит только для просмотра:
Сделаем так и перезапустим 1С, проверим, что теперь кликнуть и изменить реквизит суммы уже не получится:
Задание по уроку:
1. Доработайте остальные формы документов для вычисления суммы при помощи нашей общей процедуры. Убедитесь при помощи отладчика, что это действительно так.
2. Добавьте в справочник “БытоваяТехника” ещё один реквизит и назовите его “СоставноеНаименование”. Сделайте так, чтобы при записи справочника этот реквизит заполнялся автоматически составными словами из наименования и в скобках бренд. Вот так:
3. Сделайте поле составного наименования доступным только для просмотра, т.к. оно должно формироваться автоматически и не предназначено для редактирования.
Если всё получилось как нужно – молодцы! Если нет, давайте разберёмся что не так.
El Vinto, 2023