Вопросы 1С

Вступление

Для чего вообще стоит отказываться от модальности и, например, Вопрос заменять на ПоказатьВопрос? Всё дело в том, что больше года назад 1С-ники объявили «войну» модальным окнам. Исключение составляют только те, у кого самописная конфигурация, работа с которой не будет вестись на IPad, в режиме сервиса или с помощью веб-клиента. А если у вас обычная Бухгалтерия 3.0 и вы не собираетесь бухгалтеру давать доступ к базе через IPad, всё равно вам придётся заменить все модальные методы на немодальные, т.к. рано или поздно «Режим использования модальности» станет «Не использовать»!

Что же думает по предлагаемому вопросу специалисты фирмы 1С? Для начала можно посмотреть на тему «Вопрос в обработчике формы ПередЗакрытием»:

Особенность диалога с пользователем в этом (и многих других) обработчиках заключается в том, что в зависимости от реакции пользователя принимается решение: продолжать дальнейшие действия, или отказаться от них. Для этого используется параметр процедуры Отказ. При одном ответе пользователя мы отказываемся от продолжения (Отказ = Истина). При другом ответе пользователя — продолжаем дальнейшие действия.

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

Поэтому мы действуем в два приёма:

В первый раз безусловно отменяем дальнейшие действия (Отказ = Истина) и выводим вопрос пользователю;

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

Проблема заключается в том, что обработчик ПередЗакрытием будет выполнен два раза. И чтобы отличить первое его выполнение от второго (когда ответ пользователя уже известен) мы используем клиентскую переменную ВыполняетсяЗакрытие в качестве флага.

В первый проход её значение равно Ложь, и это значит, что нужно отказаться от закрытия и задать вопрос. Во второй проход её значение равно Истина, и это значит, что вопрос задавать не надо:

&НаКлиенте Перем ВыполняетсяЗакрытие; &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) Если Не ВыполняетсяЗакрытие Тогда Отказ=Истина; ПоказатьВопрос(Новый ОписаниеОповещения(«ПередЗакрытиемЗавершение», ЭтотОбъект), «Закрывать форму?», РежимДиалогаВопрос.ДаНет); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПередЗакрытиемЗавершение(РезультатВопроса, ПараметрыЗаписи) Экспорт Если РезультатВопроса = КодВозвратаДиалога.Да Тогда ВыполняетсяЗакрытие = Истина; Закрыть(); КонецЕсли; КонецПроцедуры ВыполняетсяЗакрытие = Ложь;

Этот пример схож с нашей темой и очень часто на него ссылаются в теме «ПоказатьВопрос в обработчике формы ПередЗаписью»:

В обработчике события формы ПередЗаписью также может возникнуть потребность задать вопрос. Как и в предыдущем примере. Однако здесь вопрос так просто не решается. Отличие заключается в следующем.

В предыдущем примере, оказываясь в обработчике ПередЗакрытием, мы однозначно знали действие, которое должно быть выполнено. Это закрытие формы. Поэтому в обработке оповещения мы смело писали Закрыть().

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

Поэтому тут можно предложить три варианта, но все они, к сожалению, обладают недостатками:

* Изменить логику прикладного решения так, чтобы не было диалога с пользователем в этом обработчике. Это не всегда возможно;

* В обработке оповещения с помощью собственной блокирующей формы задавать пользователю развернутый вопрос, предполагающий точное описание дальнейших действий: Отказаться?, Только записать?, Записать и закрыть? Это может выглядеть не очень красиво, ведь пользователь уже нажал «Записать и закрыть», а его опять об этом спрашивают;

* Не использовать стандартные команды формы Записать, «Записать и закрыть». Вместо них создать собственные команды, в которых и выполнять необходимые алгоритмы. Создание собственных команд потребует дополнительных трудозатрат.

Задача сложная, поэтому разработчики при задании вопроса ПередЗаписью, в первую очередь рекомендуют отказаться от этой идеи…

Дальше предлагают задать вопрос с множеством вариантов: «Отказаться, Только записать, Записать и закрыть». Помимо описанного минуса (пользователь и так уже заранее выбрать вариант, а его тут ещё раз спрашивают) есть ещё: в ПередЗаписью программа могла попасть и из «Отмена проведения». Т.е. надо добавлять ещё кнопку? Мне кажется этот вариант некрасивым.

Остаётся только третий вариант с использованием нестандартных команд формы. Его мы и будем реализовывать. И не стандартной командой у нас будет только «Провести и закрыть». Как и в примере к теме «Вопрос в обработчике формы ПередЗакрытием», нам придётся при первом заходе давать Отказ = Истина, и только во втором заходе выполнять реальную запись. И ещё нам где-то нужно будет запоминать, что это именно второй заход в процедуру «ПередЗаписью». 1С-ники предложили это сделать через общую клиентскую переменную, в рассматриваемом примере это можно сделать через ПараметрыЗаписи.

Пример использования ПоказатьВопрос в обработчике формы ПередЗаписью

1. Сначала нам нужно убрать стандартную команду «Провести и закрыть» из формы и создать свою команду и кнопку.

1.А. Если у вас уже кнопка «Провести и закрыть» не типовая – вам повезло, можете смело приступать к п. 2.

1.Б. Стандартная команда убирается через Свойства формы – Состав команд – Снимаем ненужную команду. Как добавлять команду и кнопку на форму, я не буду описывать, только напомню, что кнопку «Провести и закрыть» необходимо сделать кнопкой по умолчанию.

1.В. Теперь вариант сложнее в реализации, но проще в сопровождении типовой конфигурации. Практически в каждом обновлении Бухгалтерии программисты умудряются изменить 10-50% форм документов, поэтому в типовой конфигурации для сопровождения проще кодом убрать стандартную кнопку и добавить свою команду и кнопку.

Для начала в обработчике формы «ПриОткрытии» необходимо убрать стандартную кнопку «ПровестиИЗакрыть».

Элементы.ФормаПровестиИЗакрыть.Видимость = Ложь;

Замечание: у пользователя с большими ограничениями к документу в платформе 8.3.7 вообще не появляется кнопка «Провести и закрыть». Поэтому для платформы 8.3.7 корректней писать код:

Если Элементы.Найти(«ФормаПровестиИЗакрыть»)<>Неопределено Тогда Элементы.ФормаПровестиИЗакрыть.Видимость = Ложь; КонецЕсли;

Дальше добавляем команду и кнопку в обработчике формы «ПриСозданииНаСервере»::

НоваяКоманда1 = ЭтаФорма.Команды.Добавить(«ПровестиИЗакрыть2»); НоваяКоманда1.Действие = «ПровестиИЗакрыть»; НовыйЭлемент = Элементы.Добавить(«ФормаПровестиИЗакрыть2» , Тип(«КнопкаФормы»), Элементы.ФормаКоманднаяПанель); НовыйЭлемент.Заголовок = «Провести и закрыть»; НовыйЭлемент.ИмяКоманды = НоваяКоманда1.Имя; НовыйЭлемент.КнопкаПоУмолчанию = Истина; Элементы.Переместить(НовыйЭлемент,НовыйЭлемент.Родитель,Элементы.ГруппаКнопкиКоманднойПанели);

Соответственно в этом коде заложены типовые наименования для ФормаДокументаОбщая документа «Поступление (акты, накладные)» (например Элементы.ГруппаКнопкиКоманднойПанели), которые в каждом конкретном случае необходимо будет менять на свои.

2. Дальше нам нужно в процедуру на новую кнопку «Провести и закрыть» написать код:

&НаКлиенте Процедура ПровестиИЗакрыть(Команда) ПараметрыЗаписи = Новый Структура(); ПараметрыЗаписи.Вставить(«РежимЗаписи», ПредопределенноеЗначение(«РежимЗаписиДокумента.Проведение»)); ПараметрыЗаписи.Вставить(«Закрыть», Истина); Если Записать(ПараметрыЗаписи) Тогда Закрыть(); КонецЕсли; КонецПроцедуры

Как я писал выше, мы будем обмениваться информацией между нашими процедурами через ПараметрыЗаписи. В ПередЗаписью мы не знаем, нажали мы «Записать», «Провести» или «Провести и закрыть», для этого в параметрах мы передаём параметр Закрыть. Если в параметрах записи есть этот параметр, значит надо закрыть форму после успешной записи.

3. Допустим, нам надо задавать вопрос не всегда, а только когда документ проведён. Теперь мы в процедуру «ПередЗаписью» добавляем (если эта процедура не существовала – создаём) новый код:

Если Не ПараметрыЗаписи.Свойство(«ВопросЗадан») И Объект.Проведен Тогда Отказ = Истина; Оповещение = Новый ОписаниеОповещения(«ПоказатьВопросЗавершение», ЭтаФорма, ПараметрыЗаписи); ТекстВопроса = «Данный документ уже проведён. Вы действительно хотите перепровести или отменить проведение документа?»; ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 20, КодВозвратаДиалога.Нет,, КодВозвратаДиалога.Нет); КонецЕсли;

Свойство «ВопросЗадан» мы будем заполнять в оповещении, чтобы узнавать, когда в процедуру «ПередЗаписью» мы зашли во второй раз (в примере 1С в процедуре ПередЗакрытием это делалось через переменную «ВыполняетсяЗакрытие»). Другими словами: в структуре «ПараметрыЗаписи» есть свойство «ВопросЗадан», значит, вопрос уже задавали, и пользователь уже ответил утвердительно, если же свойства нет, значит, в процедуре «ПередЗаписью» мы первый раз.

После метода ПоказатьВопрос можно ещё написать «Возврат», если у вас есть ещё какой-то код в процедуре «ПередЗаписью», выполняемый после вопроса.

4. Создаём процедуру «ПоказатьВопросЗавершение», в которую программа будет входить, когда пользователь ответит на вопрос (или произошёл таймаут).

&НаКлиенте Процедура ПоказатьВопросЗавершение(Результат, ПараметрыЗаписи) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда ПараметрыЗаписи.Вставить(«ВопросЗадан», Истина); Если Записать(ПараметрыЗаписи) И ПараметрыЗаписи.Свойство(«Закрыть») Тогда Закрыть(); КонецЕсли; КонецЕсли; КонецПроцедуры

В этой процедуре мы и используем переданное ранее свойство «Закрыть». Если свойства нет, значит, закрывать не надо.

5. Теперь нам надо обработать нажатие «крестика» пользователем. Для этого нам нужна обработчик формы «ПередЗакрытием». Если его нет, то его можно создать на форме «ручками» или программно в обработчике «ПриСозданииНаСервере»:

ЭтаФорма.УстановитьДействие(«ПередЗакрытием»,»ПередЗакрытием»);

Далее добавляем код в ПередЗакрытием и создаём ещё одну процедуру:

&НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) Если Модифицированность Тогда Отказ = Истина; ТекстВопроса = НСтр(«ru = ‘Данные были изменены. Сохранить изменения?'»); Оповещение = Новый ОписаниеОповещения(«ВопросПередЗакрытиемЗавершение», ЭтотОбъект); ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВопросПередЗакрытиемЗавершение(Результат, ДополнительныеПараметры) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда ПараметрыЗаписи = Новый Структура(); ПараметрыЗаписи.Вставить(«Закрыть», Истина); Если Записать(ПараметрыЗаписи) Тогда Закрыть(); КонецЕсли; ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда Модифицированность = Ложь; Закрыть(); КонецЕсли; КонецПроцедуры

Получается, что пользователь когда нажал крестик ответит сначала на вопрос «Сохранить изменения?» и потом задастся ещё вопрос, который у вас прописан «ПередЗаписью». Если вас это не устраивает, можно передать параметр «ВопросЗадан» в «ВопросПередЗакрытиемЗавершение» и тогда второго вопроса не будет.

Вопрос против ПоказатьВопрос

А как бы мы решили задачу, если бы можно было использовать модальные вызовы? А очень просто, мы бы написали в процедуре «ПередЗаписью» следующий код:

Если Объект.Проведен Тогда ТекстВопроса = «Данный документ уже проведён. Вы действительно хотите перепровести или отменить проведение документа?»; Ответ = Вопрос(ТекстВопроса,РежимДиалогаВопрос.ДаНет,20,КодВозвратаДиалога.Нет,,КодВозвратаДиалога.Нет); Если Не Ответ=КодВозвратаДиалога.Да Тогда Отказ = Истина; Возврат; КонецЕсли; КонецЕсли;

И всё! Никаких «заморочек» типа «А что пользователь нажал: Провести или ПровестиИЗакрыть?». И ещё надо будет отработать нажатие крестика в «ПередЗакрытием».

Изначально похожий код я реализовывал у себя в Бухгалтерии предприятия 3.0. Задача заключалась в следующем: при определённом наборе условий (это не одно условие Объект.Проведен, как указано в примере в данной публикации) из ФормаДокументаОбщая документа ПоступлениеТоваровУслуг спрашивать дополнительно подтверждения его действий. Ниже перечислены нюансы, которые мне не пришлось обходить, т.к. не подпадали под задачу.

В обработчик формы «ПередЗаписью» программа не заходит, если: 1) пользователь нажал на кнопку «Пометить на удаление / снять пометку»; 2) если пользователь нажал на не проведённом документе кнопку «ДТ/КТ». И это не всё: если вы на форме документа создали всё, как я написал, и пользователь из формы списка перепроведёт документ – то никаких вопросов программа ему не задаст. Необходимо все интересующие вас кнопки на форме списка заменять на свои и отслеживать действия пользователя. Ещё у документа может быть не одна форма документа, а несколько (например, документ ПоступлениеТоваровУслуг в БП 3.0, где 3 формы: общая, товары и услуги). В каждой форме документа надо написать много кода…

В связи с кучей нюансов остаётся актуальным первый совет от 1С (который сначала, без подробного вникания в задачу, может вызвать улыбку): «Изменить логику прикладного решения так, чтобы не было диалога с пользователем в этом обработчике».

+7(495)688-90-02,

До особого указания экзамены проводятся в дистанционном формате (если в городе/регионе введен режим самоизоляции). Обращайтесь в центры сертификации вашего города https://1c.ru/prof/tests/index.jsp Допускается сдавать экзамены в экзаменационном центре другого города, если в вашем городе не проводят дистанционную сдачу. Партнеры могут сдавать только в центрах со статусом СЭЦ, в том числе 1С:Учебный центр №1 в Москве https://1c.ru/uc1. По вопросам можно писать на prof@1c.ru

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

2. Вопрос: Как гарантированно сдать экзамен и получить сертификат?
Ответ: Чтобы пройти тестирование и получить сертификат «1С:Профессионал», необходима предварительная подготовка.
Это могут быть:

3. Вопрос: Процедура сдачи экзамена «1С:Профессионал»?
Ответ: Экзамен «1С: Профессионал» – это тестирование, которое сдается в Центре сертификации. Тест состоит из 14-и вопросов, допускается только две ошибки, т.е. если правильно ответили на 12 из 14-и вопросов, получите сертификат «1С:Профессионал». На экзамен отводится 30 минут. Обращаем внимание, что на сайте с дистанционными курсами edu.1c.ru, представлено учебное тестирование, которое содержит полную базу вопросов, и Вы совершенно бесплатно можете потренироваться, попробовать свои силы и сдать тест: http://edu.1c.ru/dist-training/default.asp

4. Вопрос: Когда будет известен результат тестирования?
Ответ: Результат будет известен сразу после завершения тестирования. В случае успешно выполненного задания в Центр сертификации приходит сертификат «1С:Профессионал» от фирмы «1С».

5. Вопрос: Сколько стоит пересдача экзамена?
Ответ: Вторая попытка сдачи экзамена бесплатна, но только в том центре, где проходили сертификацию в первый раз.

6. Вопрос: Я хочу сдавать экзамен 1С:Профессионал как частное лицо, но мне пришел отказ, с формулировкой:
Заявка №123456 отклонена Иванов Петр Федорович не является сотрудником контрагента У Иванов Петр Федорович есть сертификаты у других партнеров.
Что мне делать?
Ответ: Отказ с данной формулировкой возникает в том случае, если сдающий числится за партнером.
Есть 2 варианта решения:

  • Если Вы действительно работаете у партнера, то подать новую заявку на экзамен в СЭЦ (если он есть в городе, если нет, то в АЦС), указав так же код партнера.
  • Если Вы больше не работаете у партнера, то надо написать в партнерский отдел — fran@1c.ru Я, Иванов Петр Федорович, не являюсь больше сотрудником фирмы ООО «ИИ», прошу меня открепить. После того как Вас открепят и сообщат об этом, можно снова подавать заявку на экзамен (данные ФИО и фирмы приведены для примера, все совпадения случайны). Рассмотрение заявки 1-3 дня.

7. Вопрос: Если я работаю у партнера, могу ли я сдавать экзамен как частное лицо? В АЦС, а не в СЭЦ?
Ответ: Нет, не можете. Если в городе есть СЭЦ, а Вы являетесь сотрудником партнерской организации, то Вы обязаны сдавать именно в СЭЦ, см. Инфописьмо (Ссылка: №25409 от 18.01.2019).

9. Вопрос: Возможно ли экзамен «1С:Профессионал» сдать из дома?
Ответ: Можно, только в случае, если вы являетесь сотрудником фирмы-франчайзи малого города. Подробнее о правилах прохождения тестирования 1С:Профессионал см. здесь: http://edu.1c.ru/dist/test. Клиенты, не являющиеся сотрудниками фирмы-франчайзи и сотрудники фирм-франчайзи, расположенных от Центра сертификации менее чем в 100 км, сдают экзамены в Центрах сертификации. Подробнее см. здесь: http://1c.ru/prof/acs-list.jsp.

11. Вопрос: Возможно ли восстановить сертификат, который был утерян?
Ответ: Возможно. Стоимость услуги 150 р. за сертификат. Для восстановления сертификата сделайте запрос на prof@1c.ru с темой «Восстановление сертификата», в тексте письма Вам нужно указать: ФИО, название сертификата, примерно, когда был получен (например, Иванов Иван Иванович, сертификат «1С:Профессионал» по бухгалтерии, получен в 2008 году).

12. Вопрос: Как мне узнать, что экзамен переведен на новую редакцию?
Ответ: За месяц до перехода на новую редакцию будет выпущено новое информационное письмо с извещением о начале продаж нового комплекта вопросов и дате начала тестирования «1С:Профессионал» по новой редакции. По каким редакциям проводится экзамен «1С:Профессионал» в настоящее время см. .

Записи созданы 8837

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Похожие записи

Начните вводить, то что вы ищите выше и нажмите кнопку Enter для поиска. Нажмите кнопку ESC для отмены.

Вернуться наверх