Разработка и сценарное тестирование с Vanessa-ADD. Практические примеры сценариев. Шаги встроенной библиотеки

Публикация № 984854

Разработка - Практика программирования

Vanessa ADD Automation Driven Development Behavior BDD Сценарное тестирование

Третья часть цикла публикаций, посвященных Vanessa-ADD и автоматизации тестирования. Переходим к практике.

 

Пример №1.  Присоединяемые файлы. Работа со структурой Контекст. Выполнение произвольного кода.

Пример №2.  Интеграционный механизм. Распределенная информационная база УТ 11. Подключение к двум разным базам.

Пример №3.  Проверка движений документа через форму списка. Шаг открытия произвольной формы.

 

 

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

 

Теперь мы переходим к практике создания сценариев и рассмотрим несколько сквозных примеров на основе шагов встроенной в Vanessa-ADD библиотеки. Как и ранее, чтобы быть ближе к реальным практическим задачам, сценарии будем создавать для “Управление торговлей 11.4”. Задействованы во многом будут механизмы БСП, поэтому их должно быть легко адаптировать для других конфигураций на основе БСП.

Изначально в планах было привести здесь несколько простых сценариев, а уже в следующий раз перейти к сложным. Но был риск, что на такое постепенное погружение в тему просто не хватит времени. Поэтому розовые очки придётся снять уже здесь ))  Прошу не делать вывод на основе приводимых примеров о чрезмерной сложности Vanessa-ADD для практического применения. Рассматриваемые примеры будут искусственно усложнены в учебных целях и в ходе их рассмотрения будет подробно разобрано максимально возможное количество библиотечных шагов, возможных ошибок и даже немного внутренности Vanessa-ADD. В большинстве случаев реальные сценарии будут получаться проще, а часть наиболее сложных решений можно заменить на создание собственных шагов, о которых пойдёт речь в следующей публикации.

Приведенные примеры можно рассматривать как основу для своих сценариев. Чтобы упростить чтение, все тексты сценариев, кроме окончательных, содержат лишние отступы у шагов выполнения произвольного кода и шагов перехода к строкам таблиц. Vanessa-ADD не сможет корректно работать с такими текстами. Поэтому за образцы лучше брать окончательные варианты сценариев, которые приведены в конце каждого примера. Все содержащиеся в них шаги оформлены так, что Vanessa-ADD сможет их исполнить.

 

Особое внимание уделите примерам работы со структурами “Контекст” и “КонтекстСохраняемый”. В опубликованных в сети вебинарах мало информации по работе с ними. Также мало примеров на github. В то же время с ними придётся много работать, если вы хотите писать стабильные сценарии, не зависящие от времени их выполнения. (Сейчас январь 2019 года и мне недавно пришлось адаптировать несколько сценариев только потому, что в них были явно вбиты даты 2018 года, вместо того, чтобы использовать относительные даты и работу через структуру “Контекст”).

Также, если возникнут вопросы по каким-либо из примененных шагов - задавайте их в комментариях.

 

 

 

Присоединяемые файлы. Выполнение произвольного кода. Работа со структурой Контекст.

 

 


На примере этого сценария мы разберем следующие вопросы:

1.  Как сделать так, чтобы при открытии диалога выбора файла был выбран какой-либо файл и этот диалог закрылся автоматически?

2.  Как нам указывать расположение файла в шагах сценария так, чтобы мы могли менять расположение каталога проекта и при этом не приходилось переписывать сценарий?

3.  Как сделать сохранение прикрепленного файла на диск и проверить его наличие, чтобы убедиться в том, что прикрепленный ранее файл доступен для дальнейшей работы?

4.  Как сохранить значения полей формы в специальную структуру “Контекст” и использовать в следующих шагах?

5.  Как вызвать исполнение произвольного кода из нашего сценария не создавая никаких внешних обработок?

6.  Как проверить результат асинхронных методов платформы?


 

 

Представим, что мы находимся в роли заказчика - менеджера по закупкам или  аналитика-консультанта. Как вам больше нравится ))

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

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

Мы работаем без ордерной схемы, товаров в пути и неотфактурованных поставок, поэтому в нашем документообороте поступление товаров и приобретение товаров отражается одним и тем же документом.

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

 

Функционал: Прикрепление файлов к документам закупок



Я как менеджер по закупкам

Хочу иметь возможность прикреплять скан-копии первичных документов к документам в базе 1С и извлекать их из документов в базе 1С

Чтобы снизить затраты времени на пересылку бумажных документов внутри компании.



Контекст:

        Дано На локальном диске компьютера пользователя существует файл СканПоступления.pdf

        И  На локальном диске компьютера пользователя нет файла СканПоступления_СохраненныйИзДокумента.pdf

        И  Я запускаю сеанс 1С для проверки работы с прикрепленными файлами

   

Сценарий:  Прикрепление файлов к новому документу приобретения товаров и услуг.

   

        Тогда я создаю новый документ “Приобретение товаров и услуг”

        И  я пытаюсь прикрепить к нему файл СканПоступления.pdf



        Тогда система сообщает о необходимости предварительно записать документ

        И  я соглашаюсь выполнить запись документа



        Тогда открывается диалог выбора файла

        И  в нем я выбираю файл СканПоступления.pdf

       

        Тогда файл становится доступен для выбора в списке прикрепленных к документу файлов

        И  я закрываю документ приобретения товаров



        И я заново открываю документ приобретения

        И в списке прикрепленных файлов по прежнему доступен для выбора ранее прикрепленный файл



        Тогда  я сохраняю этот файл на диск компьютера пользователя под именем СканПоступления_СохраненныйИзДокумента.pdf

        И  на диске действительно появляется сохраненный файл

 

 


 

Теперь мы будем выступать в роли разработчиков.

Мы подключаем документ “Приобретение товаров и услуг” к подсистеме БСП “Работа с файлами”. Конечно же соблюдая все правила указанные в документации для нашей версии БСП https://its.1c.ru/db/bsp244doc#content:1833:1. И проверяем функционал на соответствие спецификации.

Убеждаемся, что он работает, после чего получаем возможность превратить изначальную спецификацию в исполняемый Ванессой сценарий. Запись действий пользователя реализуем “кнопконажималкой”.

Пусть каталог в котором мы работаем с нашими спецификациями  - это  C:\data\features. Для работы с этим сценарием создадим в нем подкаталог "Присоединенные файлы" , в нем разместим наш прикрепляемый файл СканПоступления.pdf, играющий роль скана первичного документа.

 

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

 

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

 

1)   Избавляемся от зависимости от других сценариев

 

При создании документа приобретения товаров при выборе хозяйственной операции мы сначала нажимаем на кнопку “По хоз.операциям” а потом “По видам документов”. Это сделано для того, чтобы в нашем сценарии автоматически появился шаг

И я нажимаю на кнопку 'По видам документов'

и нам не пришлось бы набирать его вручную. Этот шаг нужен чтобы сделать наш сценарий максимально независимым от других - если в каких-то других сценариях происходит создание документа закупки и нажимается кнопка “По хоз.операциям” то система запомнит этот выбор и в нашем сценарии мы могли бы получить ошибку при попытке развернуть нужную нам строку - её бы просто не оказалось в окне выбора типа документа.  Не нужный нам  шаг нажатия на кнопку “По хоз.операциям” мы затем удалим.

 

 

2)   Избавляемся от необходимости ручного набора шагов

 

После прикрепления нужного нам файла мы добавили еще один файл, а затем снова выбрали в списке нужный нам файл. Зачем? Это необходимо чтобы в списке файлов появилось две строки и мы могли автоматически записать шаг

 

И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'    |

                | '19.01.2019 0:43:50' | 'СканПоступления' |

 

Этот шаг мы оставим, а лишние шаги выбора второго файла затем удалим. Также в шаге выбора строки мы удалим лишнюю колонку с датой изменения - она для нас не важна, нам важно только наименование. Так мы сделаем наш сценарий более стабильным и мы не будем зависеть от даты изменения документа. Теперь наш шаг будет выглядеть так:

 

И в таблице "Список" я перехожу к строке:

                | 'Наименование'    |

                | 'СканПоступления' |

 

Точно также поступим со всеми прочими шагами выбора строки - в них оставим только важные для нас колонки.

 

 

3)   Проверяем существование файла применяя лишь библиотечные шаги

 

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

Это как раз и была проверка наличия файла. Как мы увидим далее Vanessa-ADD ограничена в выполнении файловых операций и у нее нет шага “На диске есть файл …..”  Однако добавив шаги, прикрепления файла к документу как раз сможем убедиться в его наличии. Если файла не окажется то наш сценарий будет выдавать ошибки следующего вида :

 

 

 

 

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

 


#language: ru

Функционал: <описание фичи>



Как <Роль>

Я хочу <описание функционала>

Чтобы <бизнес-эффект>



Контекст:

        Дано Я запускаю сценарий открытия TestClient или подключаю уже существующий



Сценарий: <описание сценария>



        И В командном интерфейсе я выбираю 'Закупки' 'Документы закупки (все)'

        Тогда открылось окно 'Документы закупки (все)'

        И в таблице "СписокДокументыЗакупки" я нажимаю на кнопку с именем 'Создать_ДокументЧерезФормуВыбора'

        Тогда открылось окно 'Создание документа по хозяйственной операции'

        И я нажимаю на кнопку 'По хоз. операциям'

        И я нажимаю на кнопку 'По видам документов'

        И в таблице "ДеревоПоДокументам" я разворачиваю строку:

                | 'Представление'                                                                                        |

                | 'Приобретение товаров и услуг                                                                        ' |

        И в таблице "ДеревоПоДокументам" я перехожу к строке:

                | 'Представление'        |

                | 'Закупка у поставщика' |

        И в таблице "ДеревоПоДокументам" я выбираю текущую строку

        И Я закрываю окно 'Создание документа по хозяйственной операции'

        Тогда открылось окно 'Приобретение товаров и услуг (создание)'

        И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'

        Тогда открылось окно '1С:Предприятие'

        И я нажимаю на кнопку 'OK'

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'

        И я нажимаю на кнопку 'Файл с диска...'

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И я нажимаю на кнопку 'Файл с диска...'

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'    |

                | '19.01.2019 0:43:50' | 'СканПоступления' |

        И в таблице "Список" я активизирую поле "Наименование"

        И Я закрываю окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        Тогда открылось окно 'Документы закупки (все)'

        И в таблице "СписокДокументыЗакупки" я перехожу к строке:

                | 'Валюта' | 'Вид документа'                                      | 'Дата'                | 'Номер'       | 'Организация' | 'Склад'                    |

                | 'RUB'    | 'Приобретение товаров и услуг, Закупка у поставщика' | '19.01.2019 20:02:36' | 'СБЦБ-000033' | 'Стройснаб'   | 'Оптовый неордерный склад' |

        И в таблице "СписокДокументыЗакупки" я выбираю текущую строку

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'

        И в таблице "Список" я активизирую поле "Наименование"

        И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'  |

                | '19.01.2019 0:41:40' | 'Первая запись' |

        И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'    |

                | '19.01.2019 0:43:50' | 'СканПоступления' |

        И я выбираю пункт контекстного меню с именем 'СписокКонтекстноеМенюСохранитьКак' на элементе формы с именем "Список"

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И я нажимаю на кнопку 'Файл с диска...'

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'  |

                | '19.01.2019 0:41:40' | 'Первая запись' |

        И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'                           |

                | '19.01.2019 0:43:50' | 'СканПоступления_СохраненныйИзДокумента' |

        

 

Что в нем потребуется еще доработать вдобавок к сказанному выше?

 

4)   Запустим тест-клиент от правильного пользователя - менеджера по продажам, вместо текущего

Как запускать сеанс под нужным пользователем мы уже изучали - достаточно применить шаг

Дано Я открыл сеанс TestClient от имени "Менеджер по продажам" с паролем "" или подключаю уже существующий

 

 

5)   Избавляемся от зависимости от номера документа в шагах проверки открытия формы

Мы видим, что зависим от номера документа в шагах вида Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *' , но в то же время эти шаги позволяют использовать символ звездочки и уже это делают. Нам достаточно просто убрать лишние символы номера, сделать шаг независимым от номера, присвоенного документу :

Тогда открылось окно 'Приобретение товаров и услуг *'

 

 

6 )   Указываем пути к файлам

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

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

И Я буду выбирать внешний файл "Путь к файлу" 

 

Но есть одна тонкость. Мы не передаем имя файла в шаг нажатия на кнопку, приводящую к появлению диалогового окна выбора файла. Но и после появления диалога открытия файла очевидно уже поздно указывать, какой файл нам нужен - появится окно операционной системы, а не тест-клиента.  Технология работы с тест-клиентом (независимо от того применяем мы Vanessa-ADD или другой инструмент) требует указания файла, который мы будем выбирать, непосредственно ДО того как мы выполняем действия, приводящие к открытию диалогового окна выбора файла. Поэтому последовательность наших шагов должна оказаться следующей:

 

 

7)   Работаем со структурой “Контекст” чтобы получить независимость от номера документа

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

 

        И в таблице "СписокДокументыЗакупки" я перехожу к строке:

                | 'Дата'                          | 'Номер'             |

                | '19.01.2019 20:02:36' | 'СБЦБ-000033' |

 

Но ведь каждом выполнении сценария номер, присваиваемый документу платформой 1С, будет разным! Как поступить в этом случае?

Одним из вариантов является устанавливать номер документа вручную перед записью. Например набить в поле номер что-нибудь вроде 12345678911. И затем проводить поиск в списке по этому номеру. Вариант рабочий, но некрасивый. К тому же если одна и та же база используется для тестирования многократно это приведет к ошибкам связанных с дублями номеров. Мы воспользуемся более красивой возможностью - запомнить автоматически установленный номер документа и затем производить поиск по этому значению.

Посмотрим на описание библиотечного шага перехода к строке списка:

 

 

В описании говорится о возможности использовать Контекст и КонтекстСохраняемый для указания значений поиска.

 

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

 

В чем их отличия? Комментарии в исходном коде гласят :

 

  • Контекст - это структура, в которой хранится состояние сценария между выполнением шагов. Он очищается перед выполнением каждого сценария.
  • КонтекстСохраняемый - это структура, в которой можно хранить служебные данные между запусками сценариев. Он существует, пока открыта форма Vanessa-Behavior.

 

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

И    я запоминаю значение поля с именем "Номер" как "НомерДокумента"

 

Этот шаг добавит в структуру “Контекст” поле “НомерДокумента” (или изменит его значение, если оно уже было добавлено ранее) и установит значением этого поля номер документа. А далее, согласно описанию шага перехода к строке, заменим точное значение номера на значение из структуры “Контекст”. В итоге получим такие шаги :

 

 

 

8)   Избавляемся от бесконечного ожидания поиска документа по номеру в большом списке документов

В небольшой базе данных действий описанных выше будет достаточно. Документ будет найден. Но если в нашей базе сотни тысяч документов то поиск документа по номеру может затянуться на долгое время, даже на многие часы. Это недостаток приема, который применяет Vanessa-ADD для поиска - перебор строк.

Методически верно выполнять сценарии на небольшой демо базе. Но это не всегда возможно. Часто программисты уже написали много кода с поиском по наименованиям, ГУИДам и понаделали других некрасивых вещей, заставляющих вести разработку и выполнять сценарии на копиях баз. Можно даже сказать, что так происходит на большинстве предприятий.

Хорошим выходом в этом случае будет установка отбора по периоду в форме списка. В этом случае количество отображаемых документов будет небольшим и документ по номеру будет найден очень быстро. Также мы избавляемся от дублей номеров в разных годах (разных периодах нумерации), а ведь дубли по номерам заставили бы нас искать документ не только по номеру, но и по дате. Главное потом не забыть снять отбор по периоду, чтобы другие сценарии не наткнулись на неожиданное поведение формы списка документов закупок, в которой сохранился ранее установленный отбор по периоду.

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

 

 

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

И    я запоминаю значение поля с именем "Дата" как "ДатаДокумента"

 

Внимательный читатель скажет: “а откуда мы взяли имя Дата, ведь на форме нет названия Дата вообще, там есть заголовок  от ?” 

И действительно, нам также мог бы подойти шаг

И    я запоминаю значение поля "от" как "ДатаДокумента"

Но к сожалению в форме документа приобретения товаров несколько таких полей и Vanessa-ADD не сможет корректно обработать такой шаг - при исполнении возникнут ошибки, сообщающие о неоднозначном результате поиска элемента формы по заголовку. В таких случаях нам нужно ориентироваться именно на имя элемента, а не заголовок. Для получения имени элемента можно использовать Конфигуратор. Но еще лучше использовать исследователь форм, о котором мы уже говорили в предыдущей публикации. Нам будет достаточно выделить поле с датой, чтобы узнать имя этого элемента :

 

 

Для установки же запомненного значения в качестве даты начала интервала документа нам достаточно заменить шаг И в поле 'DateBegin' я ввожу текст '19.01.2019' на предназначенный для работы со структурой “Контекст” шаг  И в поле с именем "DateBegin" ввожу значение переменной "ДатаДокумента". Кстати, дату окончания интервала можно вообще указывать без ущерба для производительности сценария.  В итоге получим такие шаги:

 

 

 

9)  Проверяем, действительно ли система предупреждает о необходимости записать документ перед добавлением файлов

 

В новом документе мы нажимаем ссылку в панели навигации “Файлы” и после этого система сообщает о том, что документ необходимо записать. Но это ли мы проверяем в нашем сценарии?  Посмотрим на наши шаги :

        И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'

        Тогда открылось окно '1С:Предприятие'

        И я нажимаю на кнопку 'OK'

        Тогда открылось окно 'Приобретение товаров и услуг *'

Здесь нет ни слова о том, что за сообщение было в блокирующем окне с заголовком '1С:Предприятие'. Таким образом эти шаги просто проверяют появление какого-то системного окна, но ничего более. Можно конечно оставить сценарий и в таком виде, но мы же рассматриваем учебный пример и давайте научимся решать даже такую задачу, как проверка текста в системных окнах!  

В решении этой задачи нам опять же поможет исследователь форм и ещё один шаг из встроенной библиотеки.  Вот как можно поступить :

 

 

Что происходило во время записи? Мы вызвали системное окно, сообщающее о необходимости выполнить запись документа. Затем перешли в тест-менеджер и открыли исследователь форм. Этот инструмент позволяет посмотреть на внутренности не только форм, определенных в конфигураторе, но и в системных окнах 1С:Предприятия.

Мы узнаём, что в автоматически создаваемом системном окне нужное нам поле имеет имя “Поле1” а текст должен включать в себя слова "Данные еще не записаны". Таким образом мы можем добавить шаг, который позволяет нам убедиться, что платформа предлагает именно записать документ, а не выдаёт какое-то другое сообщение об ошибке или другой текст. Нужный нам шаг будет выглядеть следующим образом :  

И значение поля с именем "Поле1" содержит текст "Данные еще не записаны"

 

 
 Подведём промежуточный итог. Наш сценарий после внесённых правок выглядит так  (под спойлером)  

 

10) Файловые операции через выполнение произвольного кода на встроенном языке платформы 1С:Предприятия

 

Что нам следует сделать дальше?

Мы еще не реализовали указанную в спецификации проверку на существование файла скана поступления и проверку того, что файл СканПоступления_СохраненныйИзДокумента.pdf  не существует на момент запуска сценария. Более того, поскольку этот файл создаем мы сами, то нам нужно не просто проверить наличие этого файла, но и удалить его, если он есть.

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

 

 

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

Этот шаг имеет следующий вид :

  И затем я выполняю код встроенного языка

    |'  Строка кода 1   '|

    |'  Строка кода 2   '|

 

Важно помнить две особенности этого шага :

  • Код выполняется на стороне тест-менеджера , а не тест-клиента. То есть тест-менеджер не вызывает методы тест-клиента для выполнения этого кода, а выполняет его сам. Иногда это даже удобно, например в тех случаях когда нужно выполнить код под администратором а тест-клиент запущен под пользователем с ограниченными правами. Так например можно проверять RLS - запросом со стороны тест-менеджера мы убеждаемся что элемент есть в базе, а на стороне тест-клиента мы можем убедиться, что элемент не виден в динамическом списке.
  • Код выполняется на стороне клиента, а не сервера. Для выполнения кода на стороне сервера по прежнему придется создавать свой шаг и писать его реализацию, типовых шагов для этого нет. В следующей публикации мы создадим такой шаг.
  • Код выполняется через вызов оператора “Выполнить”. То есть отладка его проблематична. Не следует писать большие тексты ))
  • Каждая строка кода ограничивается  символами   |'  с одной стороны  и   '| с другой стороны. Вместо одинарной кавычки можно использовать двойную, но не стоит этого делать. Одинарные кавычки удобны, если мы хотим использовать двойную кавычку в своём коде. В этом случае двойную кавычку не придётся экранировать.

 

Итак, наша задача состоит в написании правильного кода для платформы 1С. Давайте также продолжим изучение возможности работы со структурой “Контекст” и задействуем ее в нашем механизме еще раз. "Контекст" доступен программно во всех шагах. Мы можем выполнить шаг

   И затем я выполняю код встроенного языка

     |'  Контекст.Вставить("Поле1", "Привет!"); '|

     |'  Сообщить(Контекст.Поле1); '|

 

И получить в окне сообщений текст “Привет!”.

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

И выражение внутреннего языка "Любое выражение языка 1С" Истинно

 

Итого нам будут нужны такие шаги:

 

Если файл не существует, то сценарий с такими шагами выдаст ошибку.

Для удаления файла будем вызывать асинхронный метод НачатьУдалениеФайлов (синхронные методы на клиенте в последних версиях типовых конфигураций использовать нельзя), а затем проверим существование файла тем же способом , что и выше :

 

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

Общим правилом по обходу проблем с асинхронными методами в сценариях Ванессы является либо явная установка паузы, либо вызов специального шага-ожидания. Например следующие два шага :

И Пауза 20

Тогда открылось окно "ИмяОкна"

с точки зрения конечного результата эквивалентно одному более понятному шагу

И я жду открытия окна "Имя окна" в течение 20 секунд

 

Но при этом второй вариант не только проще понять при чтении сценария, но также он отработает быстрее в случае, если ожидаемое окно появится раньше, чем через 20 секунд  (появление окна проверяется каждую секунду). Поэтому, когда это возможно, следует выбирать специальные шаги-ожидания. Для случая с файлами мы не имеем такого шага. Поэтому нам поможет явная установка паузы. При этом если за 2 секунды файл не удаляется,  то это очевидно можно считать ошибкой и будет нормально, если в этом случае выполнение сценария прерывается с сообщением об ошибке. С учетом этого раздел “Контекст” нашего сценария начинает выглядеть следующим образом :

 

Что же, всё готово? Ещё нет. Наш сценарий очень зависим от расположения каталога с нашими фичами-спецификациями на диске. Мы используем абсолютные пути к прикрепляемым файлам и если мы переместим каталог нашего проекта (C:\data\features) на другой диск или в другую папку, то ничего работать не будет.

 

11)    Избавляемся от зависимости от расположения наших фича-файлов на диске

 

Vanessa-ADD во многих случаях позволяет работать не только с абсолютными путями, но и с относительными. Мы уже видели это, когда рассматривали как задаются каталоги к библиотекам шагов :

 

Посмотрим описание нашего шага, устанавливающего имя файла:

 

 

Мы можем использовать каталог проекта для задания относительного пути.

Забегая вперед скажу, что это крайне необходимая возможность при автоматическом запуске сценариев, например на CI контуре. Использовать для CI фиксированные каталоги - большая ошибка, которая не позволит масштабировать контур и гибко менять его конфигурацию.

Каталог проекта задается интерактивно на вкладке сервис (не забывайте нажать на кнопку Сохранить после его изменения) :

 

 

А при запуске консольной командой каталог проекта задаётся либо с помощью ключа workspaceRoot (при запуске с помощью CLI платформы 1С) либо с помощью ключа --workspace (при запуске через Vanessa-Runner):

 

Итак наши шаги вида

И Я буду выбирать внешний файл "C:\data\features\Присоединенные файлы\СканПоступления.pdf"  

 

превращаются в шаги вида

И Я буду выбирать внешний файл "$КаталогПроекта$\Присоединенные файлы\СканПоступления.pdf"   

 

где вместо $КаталогПроекта$ будет автоматически подставляться строка C:\data\features

 

Но мы использовали путь к файлам не только в шаге выбора внешнего файла, но и в программном коде в разделе Контекст. Там мы писали  

И затем я выполняю код встроенного языка

       |'  ФайлСканаПоступления = Новый Файл("C:/data/features/Присоединенные файлы/СканПоступления.pdf"); '|

 

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

 

 

В области видимости как этого, так и любого другого обработчика помимо структур Контекст и КонтекстСохраняемый доступна переменная с именем Ванесса. Это исходная форма обработки bddRunner.epf, через которую мы можем обратиться к любой настройке, в том числе к каталогу проекта :

 

Таким образом наши шаги по выбору файла, проверке существования файла и удалению файла должны принять такой вид :

 

 

 

Реализуем в нашем сценарии всё, что рассмотрели выше. После чего объединим исходную спецификацию с детальными исполняемыми шагами.  В результате получим почти окончательный вариант нашей исполняемой спецификации (фича-файла) :

 
Текст под спойлером 

 


Почему почти? Потому что он работает под полными правами, а при проверке под менеджером по закупкам мы увидим ошибку :

 

 

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

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

Под менеджером по продажам интерфейс создания нового документа приобретения товаров оказывается другим и кроме того в демо базе УТ 11 действует RLS который не позволит записать документ без указания организации :

 

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

Процедура ОбщегоНазначенияУТ.СформироватьКомандыСоздания


        Для Каждого ИмяКонтекстГруппы Из СтруктураИменГрупп Цикл                

                ..............................               

                Если КоличествоДокументов = 1 И КоличествоХозОпераций = 1 Тогда                     

                        // Делать одно                                        

                ИначеЕсли КоличествоДокументов = 1 И КоличествоХозОпераций > 1 Тогда
                                                
                        // Делать другое
                        
                ИначеЕсли КоличествоДокументов <= 7 И КоличествоХозОпераций = 1 Тогда
                        
                        // Делать третье                        

                ИначеЕсли КоличествоДокументов <= 7 И КоличествоХозОпераций > 1 Тогда                        

                        // Делать четвертое                        

                ИначеЕсли Форма.ОтборТипыДокументов.Количество() > 7 Тогда                        

                        ДобавитьКомандуСКнопкойДляОткрытияФормыВыбора(Форма, ИмяГруппыСоздать, Префикс);
                                        
                КонецЕсли;                

        КонецЦикла;

 

 

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

 

 

 

В этот раз мы получаем окончательный вариант сценария (текст не содержит лишних отступов между строками):

 


#language: ru

@tree

Функционал: Прикрепление файлов к документам закупок

Я как менеджер по закупкам 
Хочу иметь возможность прикреплять скан-копии первичных документов к документам в базе 1С и извлекать их из документов в базе 1С
Чтобы снизить затраты времени на пересылку бумажных документов внутри компании.


Контекст:

    Пусть На локальном диске компьютера пользователя существует файл СканПоступления.pdf

            И затем я выполняю код встроенного языка
            |'  ФайлСканаПоступления = Новый Файл(Ванесса.Объект.КаталогПроекта + "/Присоединенные файлы/СканПоступления.pdf");                  '|
            |'  Контекст.Вставить("ФайлСканаПоступленияСуществует", ФайлСканаПоступления.Существует())  '|
            И выражение внутреннего языка "Контекст.ФайлСканаПоступленияСуществует = Истина" Истинно

    И На локальном диске компьютера пользователя нет файла СканПоступления_СохраненныйИзДокумента.pdf
	
            И затем я выполняю код встроенного языка
            |'НачатьУдалениеФайлов(, Ванесса.Объект.КаталогПроекта + "/Присоединенные файлы/СканПоступления_СохраненныйИзДокумента.pdf");'|
            И Пауза 2
            И затем я выполняю код встроенного языка
            |'  ФайлСканаПоступленияСохраненныйИзДокумента = Новый Файл(Ванесса.Объект.КаталогПроекта + "/Присоединенные файлы/СканПоступления_СохраненныйИзДокумента.pdf"); '|
            |'  Контекст.Вставить("ФайлСканаПоступленияСохраненныйИзДокументаСуществует", ФайлСканаПоступленияСохраненныйИзДокумента.Существует())  '|
            И выражение внутреннего языка "НЕ Контекст.ФайлСканаПоступленияСохраненныйИзДокументаСуществует" Истинно

    Тогда Я запускаю сеанс 1С для проверки работы с прикрепленными файлами

            Тогда Я открыл сеанс TestClient от имени "Менеджер по закупкам" с паролем "" или подключаю уже существующий


Сценарий: Прикрепление файлов к новому документу поступления товаров и услуг


    Пусть  я создаю новый документ “Поступление товаров и услуг”


            И В командном интерфейсе я выбираю 'Закупки' 'Документы закупки (все)'
            Тогда открылось окно 'Документы закупки (все)'
            И в таблице "СписокДокументыЗакупки" я нажимаю на кнопку с именем 'Создать_ЗакупкаУПоставщика_ПриобретениеТоваровУслуг'
            Тогда открылось окно 'Приобретение товаров и услуг (создание)'            
            И из выпадающего списка "Организация" я выбираю по строке 'Управленческая организация'


    И  Я пытаюсь прикрепить к нему файл СканПоступления.pdf

           И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'


    Тогда система сообщает о необходимости предварительно записать документ

            Тогда открылось окно '1С:Предприятие'
            И значение поля с именем "Поле1" содержит текст "Данные еще не записаны"

    Тогда  Я записываю документ
        
            И я нажимаю на кнопку 'OK'
            Тогда открылось окно 'Приобретение товаров и услуг *'


    И  Я успешно прикрепляю файл СканПоступления.pdf к документу

            И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'
            И  Я буду выбирать внешний файл "$КаталогПроекта$\Присоединенные файлы\СканПоступления.pdf"    
            И я нажимаю на кнопку 'Файл с диска...'
            Тогда открылось окно 'Приобретение товаров и услуг *'

    И  файл становится доступен для выбора в списке прикрепленных к документу файлов            

            И в таблице "Список" я перехожу к строке:
                | 'Наименование'  |
                | 'СканПоступления' |    
    

    Тогда  Я закрываю документ поступления товаров

            И  В текущем окне я нажимаю кнопку командного интерфейса 'Основное'
            И  я запоминаю значение поля с именем "Номер" как "НомерДокумента"
            И  я запоминаю значение поля с именем "Дата" как "ДатаДокумента"
            И  я вывожу значение переменной "НомерДокумента"
            И  я вывожу значение переменной "ДатаДокумента"
            И  Я закрываю окно 'Приобретение товаров и услуг *'


    И  я заново открываю документ поступления

            Тогда открылось окно 'Документы закупки (все)'
            И в таблице "СписокДокументыЗакупки" я нажимаю на кнопку с именем 'СписокДокументыЗакупкиУстановитьИнтервал'
            Тогда открылось окно 'Выберите период'
            И в поле с именем "DateBegin" ввожу значение переменной "ДатаДокумента"
            И я нажимаю на кнопку 'Выбрать'

            И в таблице "СписокДокументыЗакупки" я перехожу к строке:
                | 'Номер'            |
                | '$НомерДокумента$' |    

            И в таблице "СписокДокументыЗакупки" я нажимаю на кнопку с именем 'СписокДокументыЗакупкиУстановитьИнтервал'
            Тогда открылось окно 'Выберите период'
            И я нажимаю на кнопку 'Очистить период'
            И я нажимаю на кнопку 'Выбрать'

            И в таблице "СписокДокументыЗакупки" я выбираю текущую строку
            Тогда открылось окно 'Приобретение товаров и услуг *'

 
    И  в списке прикрепленных файлов по прежнему доступен для выбора ранее прикрепленный файл

            И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'
            И в таблице "Список" я перехожу к строке:
                | 'Наименование'  |
                | 'СканПоступления' |

 
    Тогда  Я сохраняю этот файл на диск компьютера пользователя под именем СканПоступления_СохраненныйИзДокумента.pdf

            И  Я буду выбирать внешний файл "$КаталогПроекта$\Присоединенные файлы\СканПоступления_СохраненныйИзДокумента.pdf"    
            И я выбираю пункт контекстного меню с именем 'СписокКонтекстноеМенюСохранитьКак' на элементе формы с именем "Список"    
            Тогда открылось окно 'Приобретение товаров и услуг *'    


    И   на диске действительно появляется сохраненный файл

            И  Я буду выбирать внешний файл "$КаталогПроекта$\Присоединенные файлы\СканПоступления_СохраненныйИзДокумента.pdf" 
            И я нажимаю на кнопку 'Файл с диска...'
            Тогда открылось окно 'Приобретение товаров и услуг *'
            И в таблице "Список" я перехожу к строке:
                | 'Наименование'                           |
                | 'СканПоступления_СохраненныйИзДокумента' |


 

Проверяем результат : файлы действительно удаляются, создаются, прикрепляются как мы и описали в сценарии :

 

 

Мы искусственно усложнили наш сценарий - закрывали документ, открывали его заново, устанавливали отбор по периоду на случай тестирования в копиях больших баз. Но сценарий при этом получился вполне приемлемым по размеру и удобным для модификации.

Можете теперь проверить на своей демо базе УТ 11.4 , выбрав для шага запуска тест-клиента  пользователя “Закупки (КоролевСВ)”. У меня этот пользователь был переименован в “Менеджер по закупкам”. У меня не самый последний релиз 11.4.1.241, но если в последних релизах не произошло существенных изменений, то он должен работать.

 

И последнее замечание в этом разделе. Если сравнить шаги-группы в последнем сценарии и самую первую спецификацию, то можно заметить, что мы немного изменили шаги исходной спецификации. В этом нет ничего плохого. Например изначально мы предполагали, что будет удобно если после записи документа система сразу продолжит присоединение файла. Но потом оказалось, что механизм БСП работает несколько иначе и чтобы его не изменять мы договорились с заказчиком, что после записи он еще раз нажмет на команду Файлы в панели навигации.

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

 

 

 

 

 

 

 

 

 

Интеграционный механизм: распределенная информационная база в УТ 11. Подключение к двум разным базам.

 

 

Перейдем к следующему примеру и решим еще одну нетривиальную задачу.  Напишем сценарий для обмена между двумя базами “Управления торговлей 11”.  В первой части цикла мы запускали тест-клиенты под разными пользователями. Теперь же нам предстоит посмотреть как Vanessa-ADD может задействовать в сценариях разные базы данных.

 


В ходе создания этого сценария мы разберем следующие вопросы:

1.   Как запустить несколько тест-клиентов и при необходимости переключаться между ними в процессе выполнения сценария?

2.   Как использовать одни и те же данные в двух тест-клиентах с помощью структуры Контекст?

3.   Как обеспечить уникальность элементов справочника?

4.   Как задействовать условие в сценарии для обхода поведения прикладного решения, которое сложно предсказать?


 

Для проверки интеграционных механизмов может оказаться удобнее использовать другие подходы к тестированию, нежели проверка поведения пользователя в тонком клиенте. Ведь обычно обмены выполняются без участия пользователей регламентным заданием. Но наша цель сейчас изучить возможности Vanessa-ADD и мы увидим что даже задачу тестирования интеграционного механизма можно решить стандартными средствами Vanessa-ADD. Для этого конечно потребуется запускать механизмы обмена через пользовательский интерфейс.

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

Создадим распределенную информационную базу УТ 11. Подробно останавливаться на создании базы не будем так как это задокументированный типовой механизм. 

 
 Скриншоты процесса создания узла РИБ с краткими комментариями можно развернуть

 

Для того, чтобы форма настроенных синхронизаций приняла наиболее общий вид, создадим узел обмена с “Бухгалтерией предприятия 3.0”. Создание узла для обмена с Бухгалтерией не потребует создания базы, так как это не распределенная база данных. Настройки при этом можно указать любые. К такому виду форму лучше привести чтобы потом, при появлении обменов с новыми базами, не приходилось переписывать сценарии для обмена с узлом в РИБ. Конечно в реальных базах при этом нужно сделать так, чтобы изменения не регистрировались на лишних узлах и не увеличивали объем таблиц регистрации изменений, но сейчас это не принципиально.

 

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

Ограничения и упрощения:

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

 

Критерий успешности:

Критерием успешности обмена будем считать появление в базе-приемнике номенклатуры с некоторыми наименованием, которой до обмена не было в этой базе, и определенным набором реквизитов, значения которых совпадают со значениями в базе-источнике. В данном примере будем считать что значимый реквизит только один - Артикул. При необходимости шаги для сравнения артикула можно распространить на какое угодно количество реквизитов.

 

 

Обеспечение уникальности наименования :

Ответим на вопрос: как обеспечить отсутствие номенклатуры с нужным наименованием на стороне базы-приемника до выполнения обмена?  

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

        И в базе нет элементов справочника "Номенклатура" с указанными в таблице наименованиями

                  |'Номенклатура к обмену'|

 

Этот способ не подходит нам по двум причинам:

  1. Чтобы не допустить взаимного влияния сценариев друг на друга нам необходимо контролировать, не было ли использовано это наименование в других фича-файлах. Это не сложно - возможности Visual Studio Code для поиска очень хороши. Но всё таки это лишнее неудобство.
  2. Шаг удаления элемента справочника выполняется на стороне тест-менеджера. Если мы запускаем тест-менеджер в базе-источнике то не имеем доступа в базу-приемник. Кроме того тест-менеджер может быть запущен вообще в какой-то независимой от источника и приемника базе, где даже нет справочника “Номенклатура” (ведь тест-менеджер запущенный даже из пустой базы может управлять тест-клиентом из любой другой базы).

 

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

Как нам обеспечить уникальность наименования при каждом запуске сценария? Для этого подходит не очень красивый, но зато надёжный прием - вставлять в наименование текущую дату и время.Так как наименование в этом случае не является константой, то нам нужно будет его где-то запоминать, и как мы уже знаем, для этого хорошо подходит структура “Контекст”. Она хранится на стороне тест-менеджера, но в нее можно помещать значения, полученные из тест-клиентов и передавать значения в тест клиенты.

Итак, напишем спецификацию с самыми общими шагами, определим что же мы хотим получить от нашего обмена.

 

Функционал: Передача номенклатуры из центрального узла в периферийный узел РИБ



Я как сотрудник отвечающий за НСИ

Хочу создавать номенклатуру в центральном узле распределенной базы и передавать ее в периферийные узлы с сохранением уникальных свойств этой номенклатуры и переносом значимых реквизитов.

Чтобы

    -  обеспечить единый источник информации о номенклатуре:

    -  избежать необходимости создавать номенклатуру в каждой периферийной базе в отдельности

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




Сценарий : Передача новой номенклатуры из центрального узла в периферийный


        Пусть Я запускаю базу центрального узла с правами администратора системы

        И в базе центрального узла нет данных к обмену с базой периферийного узла



        Тогда я создаю новую номенклатуру с уникальным наименованием

        И    я указываю в ней артикул AA-11-BB-22

        И    я записываю номенклатуру из формы

        И    я убеждаюсь, что созданная номенклатура зарегистрировалась к обмену

        И    я выполняю отправку данных в периферийный узел

        И    я закрываю базу центрального узла



        Тогда я запускаю базу периферийного узла с полными правами

        И   в базе периферийного узла нет данных к обмену с базой-источником


        Тогда я выполняю загрузку данных в периферийный узел

        И нахожу загруженную номенклатуру с ранее сформированным уникальным наименованием

        И убеждаюсь, что также у нее корректно установлен артикул

        И закрываю базу периферийного узла

        



Сценарий: Обновление свойств ранее созданной номенклатуры

        Дано  Сценарий пока не реализован


 

 

Чтобы не переписывать несколько раз длинный сценарий заранее посмотрим с какими сложностями придётся столкнуться и какие новые исполняемые шаги мы будем использовать.

 

1)   Подключение к нескольким тест-клиентам и переключение между ними

 

Первым из таких шагов будет шаг по запуску тест-клиента в произвольной базе, который в форме выбора известных шагов выглядит следующим образом:  

 

Когда Я подключаю клиент тестирования с параметрами:

    | 'Имя подключения' | 'Синоним'        | 'Порт' | 'Строка соединения'                 | 'Логин' | 'Пароль' | 'Запускаемая обработка' | 'Дополнительные параметры строки запуска' |

    | 'ИмяПрофиля'      | 'СинонимПрофиля' | '1538' | 'Srvr="localhost:1941";Ref="Test";' | 'Админ' | 'Админ'  | 'c:\СуперОбработка.epf' | '/UC'                                     |

 

Важный момент здесь - порт подключения указывать не обязательно. Можно установить здесь значение ‘0’ и система сама его настроит. Одновременно этот шаг регистрирует подключенный тест-клиент в табличной части на вкладке Test clients, позволяя в дальнейшем обращаться к нему по имени для активации этого клиента и переключения между различными клиентами используя еще один шаг :

И я активизирую TestClient "Имя тест-клиента с которым он был зарегистрирован"

 

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

 

Дано Я подключаю клиент тестирования с параметрами:

       | 'Имя подключения' | 'Синоним'        | 'Порт' | 'Строка соединения'                               | 'Логин'         | 'Пароль' | 'Запускаемая обработка' |  'Дополнительные параметры строки запуска'  |

       | 'БазаИсточник'    | 'База-источник'  | '0'    | 'Srvr="HOST:1541";Ref="ut_autotest";'             | 'Администратор' | ''       | ''                      |  ''                                         |



Дано Я подключаю клиент тестирования с параметрами:

       | 'Имя подключения' | 'Синоним'        | 'Порт' | 'Строка соединения'                               | 'Логин'         | 'Пароль' | 'Запускаемая обработка' |  'Дополнительные параметры строки запуска'  |

       | 'БазаПриемник'    | 'База-приемник'  | '0'    | 'Srvr="HOST:1541";Ref="ut_autotest_reciever_";'   | 'Администратор' | ''       | ''                      |  ''                                         |


  И Пауза 5

  И я активизирую TestClient "БазаИсточник"

  И В командном интерфейсе я выбираю 'НСИ и администрирование' 'Синхронизация данных'

  И я активизирую TestClient "БазаПриемник"

  И В командном интерфейсе я выбираю 'Закупки' 'Документы закупки (все)'

  И Пауза 10  

  И я закрываю TestClient "БазаИсточник"

  И я закрываю TestClient "БазаПриемник"

 

На анимации ниже видно как выполняются эти шаги. Сначала в таблице Test clients есть только одна строка для подключения к текущей базе. Это предопределенная строка подключения к текущей базе, её даже нельзя удалить.

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

 

2)    Условие “Если” в сценарии для обхода непредсказуемого поведения системы

Также мы столкнёмся со случаем еще одного “непредсказуемого” поведения прикладного решения. В демо базе УТ включен механизм контроля уникальности номенклатуры по сочетанию свойств и по рабочему наименованию. Создавая номенклатуру с похожими свойствами мы будем натыкаться на предложение системы выбрать уже существующую номенклатуру вместо создания новой. На самом деле это зависит от вида номенклатуры, но чтобы не переписывать сценарий в будущем нам нужно сразу предусмотреть и такое поведение системы.

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

 

 

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

 

    Если появилось окно с заголовком "Конртроль уникальности*" в течение 5 секунд Тогда

        Тогда я нажимаю на кнопку "Продолжить запись"

 

 

 

3)  Ожидание завершения обмена, чтобы не нажать на невидимую кнопку “Закрыть” раньше времени

 

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

 

Текст сценария будет следующим:

 

Попробуем проиграть этот сценарий и посмотрим что произойдет :

 

Совсем не то, чего мы добивались. Окно обмена открылось….  и тут же закрылось. Это произошло благодаря шагу в конце нашего сценария

И я нажимаю на кнопку с именем 'ФормаЗакрыть'

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

В форме, где отображается прогресс обмена, нет ничего, для чего мы могли бы применить один из библиотечных шагов-ожиданий. Поэтому здесь нам вновь поможет шаг-пауза. Мы можем поставить паузу на разумное время, которым хотели бы ограничить время обмена, и превышение которого могло бы считаться ошибкой. Если за это время синхронизация не успеет пройти, то будет осуществлено нажатие на кнопку “Закрыть” и сценарий потом выдаст ошибку при попытке найти номенклатуру в базе-приемнике. Будем считать, что нас устроит такая ситуация.

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

Собственно это мы уже предусмотрели в изначальном “высокоуровневом” сценарии.

 


 

Переходим к записи действий пользователя. Произведем запись действий пользователя при обмене на стороне базы-источника:

 

 

Затем на стороне базы-приемника :

 

 

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

Объединим эти два сценария, записанные на стороне источника и стороне приемника. Удалим лишние шаги. Поставим паузы и добавим шаги подключения к базам с параметрами, добавим проверку открытия окна контроля уникальности реквизитов, сформируем наименование номенклатуры используя поле "НаименованиеНоменклатурыКОбмену" структуры “Контекст”. И это же поле будем использовать чтобы найти номенклатуру в базе-приемнике после загрузки.

В итоге получаем следующий сценарий :

 


 

#language: ru

@Tree
Функционал: Передача номенклатуры из центрального узла в периферийный узел РИБ


Я как сотрудник отвечающий за НСИ

Хочу создавать номенклатуру в центральном узле распределенной базы и передавать ее в периферийные узлы с сохранением уникальных свойств этой номенклатуры и переносом значимых реквизитов.

Чтобы 
    -  обеспечить единый источник информации о номенклатуре: 
    -  избежать необходимости создавать номенклатуру в каждой периферийной базе в отдельности 
    -  и обеспечить возможность для автоматической синхронизации свойств номенклатуры в дальнейшем.



Контекст:

    И Я однократно формирую наименование номенклатуры к обмену на основе текущей даты и времени

             И Я запоминаю значение выражения '"Номенклатура к обмену от " + Строка(ТекущаяДата())' в переменную 'НаименованиеНоменклатурыКОбмену'
             # Выполняем отладочный вывод наименования номенклатуры
             И я вывожу значение переменной "НаименованиеНоменклатурыКОбмену"   



Сценарий: Передача новой номенклатуры из центрального узла в периферийный


    Пусть Я запускаю базу центрального узла с правами администратора системы

             Дано Я подключаю клиент тестирования с параметрами:
                 | 'Имя подключения' | 'Синоним'        | 'Порт' | 'Строка соединения'                   | 'Логин'         | 'Пароль' | 'Запускаемая обработка' |  'Дополнительные параметры строки запуска'  |
                 | 'БазаИсточник'    | 'База-источник'  | '0'    | 'Srvr="HOST:1541";Ref="ut_autotest";' | 'Администратор' | ''       | ''                      |  ''                                         |

    И в базе центрального узла нет данных к обмену с базой периферийного узла

             И В командном интерфейсе я выбираю 'НСИ и администрирование' 'Синхронизация данных'             
             Тогда открылось окно 'Синхронизация данных'        
             И я нажимаю на кнопку 'Синхронизация данных'             
             Тогда открылось окно 'Список настроенных синхронизаций данных'

             И в таблице "СписокСостоянияУзлов" я перехожу к строке:
                 | 'Информационная база' | 'Программа'                          |
                 | 'Приемник'            | 'Распределенная информационная база' |
             
             И в таблице "СписокСостоянияУзлов" я активизирую поле "Программа"
             И я выбираю пункт контекстного меню с именем 'СписокСостоянияУзловКонтекстноеМенюСоставОтправляемыхДанных' на элементе формы с именем "СписокСостоянияУзлов"
             Тогда открылось окно 'Регистрация изменений для обмена с  "Приемник"'
             
             И в таблице "ДеревоМетаданных" я перехожу к строке:
                 | 'Объект конфигурации'                  |
                 | 'Источник - Управление торговлей' |
             
             И я нажимаю на кнопку 'Всех объектов выбранных типов'
             Тогда открылось окно 'Подтверждение'
             И я нажимаю на кнопку 'Да'


    Тогда я создаю новую номенклатуру с уникальным наименованием

             Тогда В панели разделов я выбираю 'НСИ и администрирование'
             И В панели функций я выбираю 'Номенклатура'
             Тогда открылось окно 'Номенклатура'
             И я нажимаю на кнопку с именем 'СписокРасширенныйПоискНоменклатураСоздать'
             Тогда открылось окно 'Номенклатура (создание)'
             И из выпадающего списка с именем "ВидНоменклатурыОбязательныеПоля" я выбираю по строке 'Кабели силовые NYM'
             И в поле 'Рабочее наименование' я ввожу значение переменной "НаименованиеНоменклатурыКОбмену"

             И из выпадающего списка "Единица хранения" я выбираю по строке 'ш'
             И из выпадающего списка "Ставка НДС" я выбираю по строке '18%'
             И из выпадающего списка "Число жил" я выбираю по строке '1'
             И из выпадающего списка "Сечение (кв_мм)" я выбираю по строке '1,5'
             И в поле 'Наружный диаметр (кв. мм)' я ввожу текст '1,0'
             И в поле 'Расчетная масса (кг/км)' я ввожу текст '1'
             И из выпадающего списка "Производитель" я выбираю по строке 'фабрика мебели'
             И я перехожу к следующему реквизиту


    И я указываю в ней артикул AA-11-BB-22
             
             И я меняю значение переключателя 'НастройкаВидимостиФормы' на 'Показать все'
             И в поле 'Артикул' я ввожу текст 'AA-11-BB-22'
             # Фиксируем ввод артикула перед тем, как его запомнить
             И я перехожу к следующему реквизиту
             И я запоминаю значение поля "Артикул" как "АртикулНоменклатурыКОбмену"

             
    И я записываю номенклатуру из формы
 
             И я нажимаю на кнопку 'Записать и закрыть'
             Когда открылось окно 'Контроль уникальности*'
             Если появилось окно с заголовком "Конртроль уникальности*" в течение 5 секунд Тогда             
                 Тогда я нажимаю на кнопку "Продолжить запись"             

    И я убеждаюсь, что созданная номенклатура зарегистрировалась к обмену

             Когда В панели открытых я выбираю 'Регистрация изменений для обмена с  \"Приемник\"'
             Тогда открылось окно 'Регистрация изменений для обмена с  "Приемник"'
             И я нажимаю на кнопку с именем 'ОбновитьВсеДанные'
             
             И в таблице "ДеревоМетаданных" я разворачиваю строку:
                 | 'Объект конфигурации' |
                 | 'Справочники'         |
             И в таблице "ДеревоМетаданных" я перехожу к строке:
                 | 'Объект конфигурации' |
                 | 'Номенклатура'        |
             И в таблице "СписокСсылок" я перехожу к строке:
                 | 'Номенклатура'                      |
                 | '$НаименованиеНоменклатурыКОбмену$' |



    И    я выполняю отправку данных в периферийный узел

             И В панели открытых я выбираю 'Список настроенных синхронизаций данных'
             Тогда открылось окно 'Список настроенных синхронизаций данных'
             И в таблице "СписокСостоянияУзлов" я перехожу к строке:
                 | 'Информационная база' | 'Программа'                          |
                 | 'Приемник'            | 'Распределенная информационная база' |
             И я нажимаю на кнопку с именем 'ВыполнитьОбменДаннымиПанельСписка'
             Тогда открылось окно 'Синхронизация данных с "Приемник"'
             # Даем 20 секунд на завершение обмена
             И Пауза 20  
             И я нажимаю на кнопку с именем 'ФормаЗакрыть'

    И    я закрываю базу центрального узла       
             
             И я закрываю TestClient "БазаИсточник"


    Тогда я запускаю базу периферийного узла с полными правами 
             Дано Я подключаю клиент тестирования с параметрами:
                 | 'Имя подключения' | 'Синоним'        | 'Порт' | 'Строка соединения'                             | 'Логин'         | 'Пароль' | 'Запускаемая обработка' |  'Дополнительные параметры строки запуска'  |
                 | 'БазаПриемник'    | 'База-приемник'  | '0'    | 'Srvr="HOST:1541";Ref="ut_autotest_reciever_";' | 'Администратор' | ''       | ''                      |  ''                                         |


    И в базе периферийного узла нет данных к обмену с базой-источником

             И В командном интерфейсе я выбираю 'НСИ и администрирование' 'Синхронизация данных'
             Тогда открылось окно 'Синхронизация данных'
             И я нажимаю на кнопку 'Синхронизация данных'
             Тогда открылось окно 'Список настроенных синхронизаций данных'
             И в таблице "СписокСостоянияУзлов" я перехожу к строке:
                 | 'Информационная база' | 'Программа'                          |
                 | 'Центральная база'    | 'Распределенная информационная база' |

             И я выбираю пункт контекстного меню с именем 'СписокСостоянияУзловКонтекстноеМенюСоставОтправляемыхДанных' на элементе формы с именем "СписокСостоянияУзлов"
             Тогда открылось окно 'Регистрация изменений для обмена с  "Центральная база"'
             И в таблице "ДеревоМетаданных" я перехожу к строке:
                 | 'Объект конфигурации'             |
                 | 'Источник - Управление торговлей' |
             И я нажимаю на кнопку 'Всех объектов выбранных типов'
             Тогда открылось окно 'Подтверждение'
             И я нажимаю на кнопку 'Да'

    Тогда я выполняю загрузку данных в периферийный узел

             И В панели открытых я выбираю 'Список настроенных синхронизаций данных'
             И в таблице "СписокСостоянияУзлов" я перехожу к строке:
                 | 'Информационная база' | 'Программа'                          |
                 | 'Центральная база'    | 'Распределенная информационная база' |   
             
             И я нажимаю на кнопку с именем 'ВыполнитьОбменДаннымиПанельСписка'
             Тогда открылось окно 'Синхронизация данных с "Центральная база"'
             # Даем 20 секунд на завершение обмена
             И Пауза 20
             И я нажимаю на кнопку с именем 'ФормаЗакрыть'
    
    
    И нахожу загруженную номенклатуру с ранее сформированным уникальным наименованием

             И В панели разделов я выбираю 'НСИ и администрирование'
             И В панели функций я выбираю 'Номенклатура'
             Тогда открылось окно 'Номенклатура'
             И я снимаю флаг с именем "ИспользоватьФильтры"
             И в таблице "СписокРасширенныйПоискНоменклатура" я перехожу к строке:
                 | 'Наименование'                      |
                 | '$НаименованиеНоменклатурыКОбмену$' |


    И убеждаюсь, что также у нее корректно установлен артикул 

             И в таблице "СписокРасширенныйПоискНоменклатура" я выбираю текущую строку
             И я перехожу к закладке "Реквизиты"
             Тогда элемент формы "Артикул" стал равен "AA-11-BB-22"

    И закрываю базу периферийного узла

             # Пауза для записи финальных кадров картинки-анимации
             И Пауза 1    
             И я закрываю TestClient "БазаПриемник"



Сценарий: Обновление свойств ранее созданной номенклатуры

             # Нереализованный сценарий будет считаться успешно выполненным
             Дано  Сценарий пока не реализован
    

 


 

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

Посмотрим, как выполняется наш сценарий :

Сценарий успешно исполняется, осуществляя поочередное подключение к двум базам.

 

Еще несколько финальных замечаний по полученному сценарию:

 

1)   Вместо одновременного запуска тест-клиентов и переключений между ними через шаг

        И я активизирую TestClient "Имя тест-клиента"

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

 

2)   Мы вновь несколько раз выполняли поиск нужной строки в списке/таблице используя поле структуры Контекст, шаги подобные :

       И в таблице "СписокСсылок" я перехожу к строке:

           | 'Номенклатура'                                              |

           | '$НаименованиеНоменклатурыКОбмену$' |

 

Это один из наиболее частых и полезных приёмов в сложных сценариях. Дальше продолжим его изучение в более сложных случаях.

 

3)   Форма номенклатуры в УТ 11 / ERP 2 очень специфична. В ней есть возможность переключаться между просмотром по иерархии (по группам номенклатуры), просмотрам по видам и свойствам, только видам, только свойствам и даже вообще отключить какую либо группировку номенклатуры при просмотре. При этом последний выбор пользователя система запоминает.  Чтобы не зависеть от этого выбора (не зависеть от других сценариев) будем создавать номенклатуру наиболее общим образом - по кнопке “Создать” не позиционируясь перед этим на виде или группе номенклатуры, а выбирая вид номенклатуры явно в самой форме. Но как уже говорилось в первой публикации такой подход вообще предпочтителен при создании тестовых объектов.

 

4)   Интересный эффект, ранее описанный во второй публикации, мы наблюдаем при исполнении второго нереализованного сценария. Vanessa-ADD встречая нереализованный шаг пропускает его и все остальные шаги этого сценария, но при этом считает, что ошибок нет.

 

 

 

 

 

Проверка движений документа через форму списка. Шаг открытия произвольной формы.

 

 


Разбирая этот пример мы будем преследовать следующие цели :

1.   Научиться работать с отборам в формах динамических списков.

2.   Научиться открывать форму регистра с учетом недоступности меню “Все функции”.

3.   Подробнее изучить шаг позиционирования на строке в таблице формы, в том числе на основе значений из структуры “Контекст”.

4.   Рассмотреть последовательность из двух сценариев в одном фича-файле.  


 

 

Поставим задачу: нам необходимо написать сценарии для регрессионного тестирования процесса проведения заказа по регистру “Расчеты с клиентами” для двух случаев:

1)   когда этапы оплаты заданы непосредственно в заказе клиента без графика платежей

2)   и когда они заполняются на основе графика платежей из соглашения с клиентом

 

Несмотря на то, что мы пишем регрессионный тест, и в этот раз не играем роли заказчиков и разработчиков, написание сценария всё равно начнем с высокоуровневых шагов. Это хорошая практика, позволяющая не просто прокликать какие-то действия, а понять что мы вообще хотим от нашей системы. Более того, это поможет впоследствии поддерживать наши сценарии в актуальном состоянии и обсуждать с коллегами.

Напишем сценарии, выделив общие шаги в контекст :

 

Функционал: Отражение заказа клиента по регистру Расчеты с клиентами



Как QA-инженер

Я хочу убедиться, что заказ клиента корректно отражается по регистру Расчеты с клиентами

Чтобы не допустить регресса системы учета при внесении в неё изменений



Контекст:

        Пусть Я запускаю систему под пользователем с правами на проведение заказа клиента и просмотр регистров

        Тогда Я создаю и записываю новый документ Заказ клиента от 01.01.2019

        И я указываю в нем контрагента, партнера, организацию и вариант продажи Реализация

        И я устанавливаю флаг отгружать одной датой с датой отгрузки 02.01.2019



Сценарий: указание трех этапов оплат непосредственно в заказе


        И я выбираю в заказе соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС без графика платежей

        И я указываю в заказе этапы платежей Аванс 10% на 05.01.2019, Предоплата 20% на 10.01.2019 и Кредит 70% на 20.01.2019



        # Цену необходимо назначать после выбора соглашения, так как при выборе соглашения она очищается

        И я выбираю для продажи услугу на общую стоимость 1000 рублей



        Когда я провожу этот заказ клиента

        Тогда в регистре “Расчеты с клиентами” появляется три записи с регистратором равным проведенному заказу клиента

        И среди этих записей есть строка с реквизитами документа, датой оплаты 05.01.2019 и суммой 100

        И среди этих записей есть строка с реквизитами документа, датой оплаты 10.01.2019 и суммой 200

        И среди этих записей есть строка с реквизитами документа, датой оплаты 20.01.2019 и суммой 700





Сценарий: Указание двух этапов оплат в графике платежей заказе


        И я создаю график оплат Аванс 30% срок 5 дней, Предоплата 70% срок 6 дней

        И я создаю соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС и созданным графиком

        И я записываю и выбираю это соглашение в заказе



        # Цену необходимо назначать после выбора соглашения, так как при выборе соглашения она очищается

        И я выбираю для продажи услугу на общую стоимость 1000 рублей



        И я заполняю этапы оплаты заказа по графику платежей



        Когда я провожу этот заказ клиента

        Тогда в регистре “Расчеты с клиентами” две записи с регистратором равным проведенному заказу клиента

        И среди этих записей есть строка с реквизитами документа, датой оплаты 06.01.2019 и суммой 300

        И среди этих записей есть строка с реквизитами документа, датой оплаты 07.01.2019 и суммой 700



 

Здесь мы выбрали для заказа клиента фиксированную дату. Это позволит без лишних сложностей проверять даты-периоды движений документа. Указание фиксированной даты документа и даты отгрузки из прошлых периодов для заказа клиента не несёт проблем с точки зрения типового функционала УТ 11. Также мы описали роль как QA-инженер, и допускаем, что у этого пользователя есть права на открытие регистров, отклонение от условий продаж и прочие “админские штучки”.

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

 

 

Удалим лишние шаги перехода к следующим реквизитам, оставляя такие шаги перед переключением на другую вкладку.

Затем заменим шаг

И я изменяю флаг 'Отгружать одной датой' 

на шаг

И я устанавливаю флаг 'Отгружать одной датой'

 

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


 

Контекст:



    Пусть Я запускаю систему под пользователем с правами на проведение заказа клиента и просмотр регистров

           

            Пусть Я открыл сеанс TestClient от имени "QA" с паролем "" или подключаю уже существующий

            И Я закрыл все окна клиентского приложения



    Тогда Я создаю и записываю новый документ Заказ клиента от 01.01.2019



            И В командном интерфейсе я выбираю 'Продажи' 'Заказы клиентов'

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздать'

            Тогда открылось окно 'Заказ клиента (создание)'

            И в поле 'от' я ввожу текст '01.01.2019  0:00:00'

            И я перехожу к следующему реквизиту

            И я нажимаю на кнопку 'Записать'

            И я запоминаю значение поля с именем "Номер" как "НомерДокумента"

            И я запоминаю значение поля с именем "Дата" как "ДатаДокумента"

   

    И я указываю в нем контрагента, партнера, пустой склад, организацию и вариант продажи Реализация



            И из выпадающего списка с именем "Партнер" я выбираю по строке 'Алхимов А.А.'

            И из выпадающего списка "Контрагент" я выбираю по строке 'Алхимов А.А.'

            И я нажимаю кнопку выбора у поля "Операция"

            И из выпадающего списка "Операция" я выбираю по строке 'Реализация'

            И из выпадающего списка "Организация" я выбираю по строке 'Стройснаб'

            И в поле с именем 'Склад' я ввожу текст ''

            И я нажимаю кнопку выбора у поля "Статус"

            И из выпадающего списка "Статус" я выбираю по строке 'К выполнению'

            И я перехожу к следующему реквизиту



    И я устанавливаю флаг отгружать одной датой с датой отгрузки 02.01.2019        

            И я перехожу к закладке "Товары"

            И я устанавливаю флаг 'Отгружать одной датой'

            И в поле 'ДатаОтгрузки' я ввожу текст '02.01.2019'

            И я перехожу к следующему реквизиту

 

 

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

Сначала прокликаем и запишем эти действия:

 

 

После записи соглашения, в форме выбора оно не становится текущей строкой. Нам нужно выбрать соглашение на основе его реквизитов, видимых в форме списка. Наиболее просто это сделать используя наименование, при этом наименование желательно должно быть уникальным. Как сгенерировать уникальное наименование мы рассматривали в предыдущем блоке, когда генерировали номенклатуру для обмена в РИБ. Здесь воспользуемся тем же приемом - запишем в структуру “Контекст” текущее время и будем дописывать его к фиксированной части наименования.

Внесём все необходимые корректировки и получим такие шаги :

 

Сценарий: Указание трех этапов оплат непосредственно в заказе



    И я выбираю в заказе соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС без графика платежей



            И я нажимаю кнопку выбора у поля "Соглашение"

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздатьИндивидуальноеСоглашение'

            Тогда открылось окно 'Индивидуальное соглашение об условиях продаж'



            И Я запоминаю значение выражения '"Соглашение к выбору от " + Строка(ТекущаяДата())' в переменную 'НаименованиеСоглашения'

            И в поле 'Наименование' я ввожу значение переменной "НаименованиеСоглашения"            



            И я перехожу к закладке "Условия продаж"

            И из выпадающего списка "Валюта взаиморасчетов" я выбираю по строке 'RUB'

            И из выпадающего списка "Детализация расчетов" я выбираю по строке 'По заказам'

            И из выпадающего списка "Оплата" я выбираю по строке 'Оплата в рублях'

            И в поле 'График оплаты' я ввожу текст ''

            И из выпадающего списка "Валюта цен" я выбираю по строке 'rub'          

            И я устанавливаю флаг 'Цена включает НДС'

            Тогда открылось окно '1С:Предприятие'

            И я нажимаю на кнопку 'Да'

            И я нажимаю на кнопку 'Записать и закрыть'

            И я жду закрытия окна 'Индивидуальное соглашение об условиях продаж *' в течение 5 секунд

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я перехожу к строке:

                | 'Наименование'             |

                | '$НаименованиеСоглашения$' |

            И в таблице "Список" я выбираю текущую строку

 

 

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

 

Но просмотрев результат записи мы обнаружим одну неприятную особенность  :  мы не увидим шага по открытию меню “Все функции”. Не увидим мы этого даже в исходном тексте XML от тест-клиента. В нём сразу после действий в форме документа будут узлы, описывающие переход к строке “Расчеты с клиентами”:

 

 

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

Дано Я открываю основную форму регистра накопления "РасчетыСКлиентами"

 

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

 

Как мы видим вид сравнения “меньше или равно” - это параметр шага. Вместо него можно написать просто “равно”. То есть наш шаг должен принять вид:

Тогда в таблице "Список" количество строк "равно" 3

 

Когда мы устанавливаем отбор по регистратору нам нужно как-то спозиционироваться на нашем заказе. Автоматически будет записан такой шаг, в котором номер документа и дата будут прописаны как константы:

 

    И в таблице "Список" я перехожу к строке:

        | 'Валюта' | 'Дата'                | 'Клиент'       | 'Номер'       | 'Сумма'    |

        | 'RUB'    | '01.01.2019 13:48:08' | 'Алхимов А.А.' | 'СБЦБ-000007' | '1 000,00' |

 

Нам разумеется нужно сделать в этот шаг подстановку номера и даты, которые ранее были сохранены в структуре “Контекст”, а также избавиться от незначащих для нас полей :

 

    И в таблице "Список" я перехожу к строке:

| 'Дата'                           | 'Номер'            |

| '$ДатаДокумента$'     | '$НомерДокумента$' |

 

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

Аналогично нам надо скорректировать шаги позиционирования на строках записей регистра накопления после установки отбора. После автоматической записи эти шаги будут иметь следующий вид:  

 

Вместо даты регистратора опять же подставим переменную из структуры “Контекст”. Также мы можем избавиться от проверки незначащих для нас колонок, например по регистратору мы итак установили отбор и проверять его нам нет необходимости. Однако проверить, что объектом расчета действительно является заказ было бы хорошо.  

Хотелось бы записать шаг следующим образом :

            И в таблице "Список" я перехожу к строке:

                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Номер строки' | 'Объект расчетов' | 'Организация' | 'Партнер'      | 'Период'              |

                | 'RUB'    | '05.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '100,00'           | 'Алхимов А.А.' | '1'            | 'Заказ клиента *' | 'Стройснаб'   | 'Алхимов А.А.' | '05.01.2019 23:59:59' |

 

Но, к сожалению, мы не можем использовать символ подстановки - звёздочку  в этом шаге. Без проверки объекта расчета он будет выполняться успешно, но как только в колонке “Объект расчетов” мы напишем “Заказ клиента *”  тут же возникнет ошибка. На скриншоте ниже видно, что первый шаг прошел успешно, а второй аналогичный, но с объектом расчетов, выдал ошибку :

 

 

И если мы действительно хотим проверять объект расчетов, то нужно сформировать его представление в структуре “Контекст” и использовать для проверки поле этой структуры. Так и сделаем. К шагам по запоминанию номера и даты добавим шаг, запоминающий представление документа-заказа. Для этого можно было бы программно обратиться к полю Объект.Ссылка формы заказа клиента, но в нашем случае можно просто взять заголовок окна (так можно делать не всегда, для некоторых объектов в УТ 11 заголовок окна будет не соответствовать представлению объекта в отчетах по движениям) :

 

После записи документа будем теперь выполнять три шага, вместо двух:

 

            И я запоминаю значение поля с именем "Номер" как "НомерДокумента"

            И я запоминаю значение поля с именем "Дата" как "ДатаДокумента"

            И я запоминаю текущее окно как "ПредставлениеОбъетаРасчетов"

 

И тогда шаг проверки записи движения примет вид :

            И в таблице "Список" я перехожу к строке:

                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |

                | 'RUB'    | '05.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '100,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '05.01.2019 23:59:59' |

   

 

Тогда наш сценарий целиком примет следующий вид :


#language: ru

@tree

Функционал: Отражение заказа клиента по регистру Расчеты с клиентами



Как QA-инженер

Я хочу убедиться, что заказ клиента корректно отражается по регистру Расчеты с клиентами

Чтобы не допустить регресса системы учета при внесении в неё изменений



Контекст:



    Пусть Я запускаю систему под пользователем с правами на проведение заказа клиента и просмотр регистров

           

            Пусть Я открыл сеанс TestClient от имени "QA" с паролем "" или подключаю уже существующий

            И Я закрыл все окна клиентского приложения



    Тогда Я создаю и записываю новый документ Заказ клиента от 01.01.2019



            И В командном интерфейсе я выбираю 'Продажи' 'Заказы клиентов'

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздать'

            Тогда открылось окно 'Заказ клиента (создание)'

            И в поле с именем 'Дата' я ввожу текст '01.01.2019  0:00:00'

            И я перехожу к следующему реквизиту

            И я нажимаю на кнопку 'Записать'

            И я запоминаю значение поля с именем "Номер" как "НомерДокумента"

            И я запоминаю значение поля с именем "Дата" как "ДатаДокумента"

            И я запоминаю текущее окно как "ПредставлениеОбъетаРасчетов"



    И я указываю в нем контрагента, партнера, пустой склад, организацию и вариант продажи Реализация



            И из выпадающего списка с именем "Партнер" я выбираю по строке 'Алхимов А.А.'

            И из выпадающего списка "Контрагент" я выбираю по строке 'Алхимов А.А.'

            И я нажимаю кнопку выбора у поля "Операция"

            И из выпадающего списка "Операция" я выбираю по строке 'Реализация'

            И из выпадающего списка "Организация" я выбираю по строке 'Стройснаб'

            И в поле с именем 'Склад' я ввожу текст ''

            И я нажимаю кнопку выбора у поля "Статус"

            И из выпадающего списка "Статус" я выбираю по строке 'К выполнению'

            И я перехожу к следующему реквизиту



    И я устанавливаю флаг отгружать одной датой с датой отгрузки 02.01.2019        

            И я устанавливаю флаг 'Отгружать одной датой'

            И в поле 'ДатаОтгрузки' я ввожу текст '02.01.2019'

            И я перехожу к следующему реквизиту





Сценарий: Указание трех этапов оплат непосредственно в заказе



    И я выбираю в заказе соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС без графика платежей



            И я нажимаю кнопку выбора у поля "Соглашение"

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздатьИндивидуальноеСоглашение'

            Тогда открылось окно 'Индивидуальное соглашение об условиях продаж'



            И Я запоминаю значение выражения '"Соглашение к выбору от " + Строка(ТекущаяДата())' в переменную 'НаименованиеСоглашения'

            И в поле 'Наименование' я ввожу значение переменной "НаименованиеСоглашения"            



            И я перехожу к закладке "Условия продаж"

            И из выпадающего списка "Валюта взаиморасчетов" я выбираю по строке 'RUB'

            И из выпадающего списка "Детализация расчетов" я выбираю по строке 'По заказам'

            И из выпадающего списка "Оплата" я выбираю по строке 'Оплата в рублях'

            И в поле 'График оплаты' я ввожу текст ''

            И из выпадающего списка "Валюта цен" я выбираю по строке 'rub'          

            И я устанавливаю флаг 'Цена включает НДС'

            Тогда открылось окно '1С:Предприятие'

            И я нажимаю на кнопку 'Да'

            И я нажимаю на кнопку 'Записать и закрыть'

            И я жду закрытия окна 'Индивидуальное соглашение об условиях продаж *' в течение 5 секунд

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я перехожу к строке:
                | 'Наименование'             |
                | '$НаименованиеСоглашения$' |

            И в таблице "Список" я выбираю текущую строку





    И я указываю в заказе этапы платежей Аванс 10% на 05.01.2019, Предоплата 20% на 10.01.2019 и Кредит 70% на 20.01.2019



            И я нажимаю на гиперссылку "НадписьЭтапыОплаты"

            Тогда открылось окно 'Правила оплаты'

            И из выпадающего списка "Расчеты" я выбираю по строке 'По заказам'  

            И в поле 'Банковский счет' я ввожу текст ''

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'  

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Аванс'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '05.01.2019'  

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '10,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Предоплата'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '10.01.2019'

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '20,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Кредит'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '20.01.2019'

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '70,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И я нажимаю на кнопку 'Перенести в документ'





    И я выбираю для продажи услугу на общую стоимость 1000 рублей



           И я перехожу к закладке "Товары"

           И в таблице "Товары" я нажимаю на кнопку с именем 'ТоварыДобавить'

           И в таблице "Товары" из выпадающего списка "Номенклатура" я выбираю по строке 'Услуга 1'

           И в таблице "Товары" в поле 'Количество' я ввожу текст '1,000'

           И в таблице "Товары" из выпадающего списка "Вид цены" я выбираю точное значение '<произвольная>'

           И в таблице "Товары" в поле 'Цена' я ввожу текст '1 000,00'

           И в таблице "Товары" я завершаю редактирование строки





    Когда я провожу этот заказ клиента

   

            И я нажимаю на кнопку 'Провести'

   

    Тогда в регистре “Расчеты с клиентами” появляется три записи с регистратором равным проведенному заказу клиента



            Дано Я открываю основную форму регистра накопления "РасчетыСКлиентами"

            Тогда открылось окно 'Расчеты с клиентами'

            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

           

            И я перехожу к закладке "Отбор"

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я перехожу к строке:
                | 'Доступные поля' |
                | 'Регистратор'    |

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я выбираю текущую строку

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я нажимаю кнопку выбора у реквизита "Значение"

            Тогда открылось окно 'Выбор типа данных'

            И В форме "Выбор типа данных" в таблице "" я перехожу к строке:
                | ''              |
                | 'Заказ клиента' |

            И в таблице "" я выбираю текущую строку

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я перехожу к строке:
                | 'Дата'                | 'Номер'            |
                | '$ДатаДокумента$'     | '$НомерДокумента$' |



            И в таблице "Список" я выбираю текущую строку

            Тогда открылось окно 'Настройка списка'

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я завершаю редактирование строки

            И я нажимаю на кнопку 'Завершить редактирование'

            Тогда открылось окно 'Расчеты с клиентами'



            Тогда в таблице "Список" количество строк "равно" 3



    И среди этих записей есть строка с реквизитами документа, датой оплаты 05.01.2019 и суммой 100



            И в таблице "Список" я перехожу к строке:

                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '05.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '100,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '05.01.2019 23:59:59' |

   

    И среди этих записей есть строка с реквизитами документа, датой оплаты 10.01.2019 и суммой 200



            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '10.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '200,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '10.01.2019 23:59:59' |



    И среди этих записей есть строка с реквизитами документа, датой оплаты 20.01.2019 и суммой 700




            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '20.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '700,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '20.01.2019 23:59:59' |



 


 

И после загрузки в Vanessa-ADD будет выглядеть так :

 

 

Наш сценарий всё ещё содержит ошибки!  Он не позволит выполниться следующему после него сценарию. И даже не позволит выполниться самому себе во второй раз. Чтобы продемонстрировать проблему давайте выполним его дважды. В первый раз ошибок не будет, а во второй раз мы увидим проблему :

 

 

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

Для исправления поведения можно поступить двумя способами - снять все флаги в таблице отборов или просто удалить все строки из таблицы отборов. Мы воспользуемся вторым способом. В этом нам поможет шаг :

И я удаляю все строки таблицы "ИмяТаблицы"

 

Добавим в конец нашего сценария следующий текст


    И я отключаю отбор в списке регистра, чтобы не влиять на другие сценарии

            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

            И я перехожу к закладке "Отбор"

            И я удаляю все строки таблицы "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор"

            И я нажимаю на кнопку 'Завершить редактирование'



 

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

 

 

Итак, финальный текст нашей спецификации (фича-файла)  получился таким:

 


 

#language: ru

@tree


Функционал: Отражение заказа клиента по регистру Расчеты с клиентами


Как QA-инженер
Я хочу убедиться, что заказ клиента корректно отражается по регистру Расчеты с клиентами
Чтобы не допустить регресса системы учета при внесении в неё изменений


Контекст:


    Пусть Я запускаю систему под пользователем с правами на проведение заказа клиента и просмотр регистров

           
            Пусть Я открыл сеанс TestClient от имени "QA" с паролем "" или подключаю уже существующий
            И Я закрыл все окна клиентского приложения


    Тогда Я создаю и записываю новый документ Заказ клиента от 01.01.2019



            И В командном интерфейсе я выбираю 'Продажи' 'Заказы клиентов'

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздать'

            Тогда открылось окно 'Заказ клиента (создание)'

            И в поле с именем 'Дата' я ввожу текст '01.01.2019  0:00:00'

            И я перехожу к следующему реквизиту

            И я нажимаю на кнопку 'Записать'

            И я запоминаю значение поля с именем "Номер" как "НомерДокумента"

            И я запоминаю значение поля с именем "Дата" как "ДатаДокумента"

            И я запоминаю текущее окно как "ПредставлениеОбъетаРасчетов"



    И я указываю в нем контрагента, партнера, пустой склад, организацию и вариант продажи Реализация



            И из выпадающего списка с именем "Партнер" я выбираю по строке 'Алхимов А.А.'

            И из выпадающего списка "Контрагент" я выбираю по строке 'Алхимов А.А.'

            И я нажимаю кнопку выбора у поля "Операция"

            И из выпадающего списка "Операция" я выбираю по строке 'Реализация'

            И из выпадающего списка "Организация" я выбираю по строке 'Стройснаб'

            И в поле с именем 'Склад' я ввожу текст ''

            И я нажимаю кнопку выбора у поля "Статус"

            И из выпадающего списка "Статус" я выбираю по строке 'К выполнению'

            И я перехожу к следующему реквизиту



    И я устанавливаю флаг отгружать одной датой с датой отгрузки 02.01.2019        

            И я устанавливаю флаг 'Отгружать одной датой'

            И в поле 'ДатаОтгрузки' я ввожу текст '02.01.2019'

            И я перехожу к следующему реквизиту





Сценарий: Указание трех этапов оплат непосредственно в заказе



    И я выбираю в заказе соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС без графика платежей



            И я нажимаю кнопку выбора у поля "Соглашение"

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздатьИндивидуальноеСоглашение'

            Тогда открылось окно 'Индивидуальное соглашение об условиях продаж'



            И Я запоминаю значение выражения '"Соглашение к выбору от " + Строка(ТекущаяДата())' в переменную 'НаименованиеСоглашения'

            И в поле 'Наименование' я ввожу значение переменной "НаименованиеСоглашения"            



            И я перехожу к закладке "Условия продаж"

            И из выпадающего списка "Валюта взаиморасчетов" я выбираю по строке 'RUB'

            И из выпадающего списка "Детализация расчетов" я выбираю по строке 'По заказам'

            И из выпадающего списка "Оплата" я выбираю по строке 'Оплата в рублях'

            И в поле 'График оплаты' я ввожу текст ''

            И из выпадающего списка "Валюта цен" я выбираю по строке 'rub'          

            И я устанавливаю флаг 'Цена включает НДС'

            Тогда открылось окно '1С:Предприятие'

            И я нажимаю на кнопку 'Да'

            И я нажимаю на кнопку 'Записать и закрыть'

            И я жду закрытия окна 'Индивидуальное соглашение об условиях продаж *' в течение 5 секунд

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я перехожу к строке:
                | 'Наименование'             |
                | '$НаименованиеСоглашения$' |

            И в таблице "Список" я выбираю текущую строку





    И я указываю в заказе этапы платежей Аванс 10% на 05.01.2019, Предоплата 20% на 10.01.2019 и Кредит 70% на 20.01.2019



            И я нажимаю на гиперссылку "НадписьЭтапыОплаты"

            Тогда открылось окно 'Правила оплаты'

            И из выпадающего списка "Расчеты" я выбираю по строке 'По заказам'  

            И в поле 'Банковский счет' я ввожу текст ''

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'  

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Аванс'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '05.01.2019'  

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '10,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Предоплата'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '10.01.2019'

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '20,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Кредит'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '20.01.2019'

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '70,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И я нажимаю на кнопку 'Перенести в документ'





    И я выбираю для продажи услугу на общую стоимость 1000 рублей



           И я перехожу к закладке "Товары"

           И в таблице "Товары" я нажимаю на кнопку с именем 'ТоварыДобавить'

           И в таблице "Товары" из выпадающего списка "Номенклатура" я выбираю по строке 'Услуга 1'

           И в таблице "Товары" в поле 'Количество' я ввожу текст '1,000'

           И в таблице "Товары" из выпадающего списка "Вид цены" я выбираю точное значение '<произвольная>'

           И в таблице "Товары" в поле 'Цена' я ввожу текст '1 000,00'

           И в таблице "Товары" я завершаю редактирование строки





    Когда я провожу этот заказ клиента

   

            И я нажимаю на кнопку 'Провести'

   

    Тогда в регистре “Расчеты с клиентами” появляется три записи с регистратором равным проведенному заказу клиента



            Дано Я открываю основную форму регистра накопления "РасчетыСКлиентами"

            Тогда открылось окно 'Расчеты с клиентами'

            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

           

            И я перехожу к закладке "Отбор"

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я перехожу к строке:
                | 'Доступные поля' |
                | 'Регистратор'    |

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я выбираю текущую строку

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я нажимаю кнопку выбора у реквизита "Значение"

            Тогда открылось окно 'Выбор типа данных'

            И В форме "Выбор типа данных" в таблице "" я перехожу к строке:
                | ''              |
                | 'Заказ клиента' |

            И в таблице "" я выбираю текущую строку

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я перехожу к строке:
                | 'Дата'                | 'Номер'            |
                | '$ДатаДокумента$'     | '$НомерДокумента$' |



            И в таблице "Список" я выбираю текущую строку

            Тогда открылось окно 'Настройка списка'

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я завершаю редактирование строки

            И я нажимаю на кнопку 'Завершить редактирование'

            Тогда открылось окно 'Расчеты с клиентами'



            Тогда в таблице "Список" количество строк "равно" 3



    И среди этих записей есть строка с реквизитами документа, датой оплаты 05.01.2019 и суммой 100



            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '05.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '100,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '05.01.2019 23:59:59' |

   

    И среди этих записей есть строка с реквизитами документа, датой оплаты 10.01.2019 и суммой 200



            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '10.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '200,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '10.01.2019 23:59:59' |



    И среди этих записей есть строка с реквизитами документа, датой оплаты 20.01.2019 и суммой 700





            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '20.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '700,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '20.01.2019 23:59:59' |





    И я отключаю отбор в списке регистра, чтобы не влиять на другие сценарии



            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

            И я перехожу к закладке "Отбор"

            И я удаляю все строки таблицы "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор"

            И я нажимаю на кнопку 'Завершить редактирование'







Сценарий: Указание двух этапов оплат в графике платежей заказе



    И я создаю график оплат Аванс 30% срок 5 дней, Предоплата 70% срок 6 дней



            И В командном интерфейсе я выбираю 'CRM и маркетинг' 'Графики оплаты'

            Тогда открылось окно 'Графики оплаты'

            И я нажимаю на кнопку с именем 'ФормаСоздать'

            Тогда открылось окно 'График оплаты (создание)'



            И Я запоминаю значение выражения '"График к выбору от " + Строка(ТекущаяДата())' в переменную 'НаименованиеГрафика'

            И в поле 'Наименование' я ввожу значение переменной "НаименованиеГрафика"          

            И в таблице "Этапы" я нажимаю на кнопку с именем 'ЭтапыДобавить'            

            И в таблице "Этапы" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Аванс'

            И в таблице "Этапы" в поле 'Срок (дн)' я ввожу текст '5'            

            И в таблице "Этапы" в поле '% платежа' я ввожу текст '30,00'

            И в таблице "Этапы" я завершаю редактирование строки

            И в таблице "Этапы" я нажимаю на кнопку с именем 'ЭтапыДобавить'

            И в таблице "Этапы" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Пре'

            И в таблице "Этапы" в поле 'Срок (дн)' я ввожу текст '6'

            И в таблице "Этапы" в поле '% платежа' я ввожу текст '70,00'

            И в таблице "Этапы" я завершаю редактирование строки

            И я меняю значение переключателя 'Учет отсрочки по' на 'календарным дням'

            И я нажимаю на кнопку 'Записать и закрыть'

            И я жду закрытия окна 'График оплаты (создание)' в течение 20 секунд





    И я создаю соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС



            Когда В панели открытых я выбираю 'Заказ клиента *'

            Тогда открылось окно 'Заказ клиента *'

            И я перехожу к закладке "Основное"



            И я нажимаю кнопку выбора у поля "Соглашение"

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздатьИндивидуальноеСоглашение'

            Тогда открылось окно 'Индивидуальное соглашение об условиях продаж'



            И Я запоминаю значение выражения '"Соглашение к выбору от " + Строка(ТекущаяДата())' в переменную 'НаименованиеСоглашения'

            И в поле 'Наименование' я ввожу значение переменной "НаименованиеСоглашения"            

           

            И я перехожу к закладке "Условия продаж"

            И из выпадающего списка "Валюта взаиморасчетов" я выбираю по строке 'RUB'

            И из выпадающего списка "Детализация расчетов" я выбираю по строке 'По заказам'

            И из выпадающего списка "Оплата" я выбираю по строке 'Оплата в рублях'

            И в поле 'График оплаты' я ввожу значение переменной "НаименованиеГрафика"

            И из выпадающего списка "Валюта цен" я выбираю по строке 'rub'          

            И я устанавливаю флаг 'Цена включает НДС'

            Тогда открылось окно '1С:Предприятие'

            И я нажимаю на кнопку 'Да'



    И я записываю и выбираю это соглашение в заказе



            И я нажимаю на кнопку 'Записать и закрыть'

            И я жду закрытия окна 'Индивидуальное соглашение об условиях продаж *' в течение 5 секунд

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я перехожу к строке:
                | 'Наименование'             |
                | '$НаименованиеСоглашения$' |

            И в таблице "Список" я выбираю текущую строку





    И я выбираю для продажи услугу на общую стоимость 1000 рублей



           И я перехожу к закладке "Товары"

           И в таблице "Товары" я нажимаю на кнопку с именем 'ТоварыДобавить'

           И в таблице "Товары" из выпадающего списка "Номенклатура" я выбираю по строке 'Услуга 1'

           И в таблице "Товары" в поле 'Количество' я ввожу текст '1,000'

           И в таблице "Товары" из выпадающего списка "Вид цены" я выбираю точное значение '<произвольная>'

           И в таблице "Товары" в поле 'Цена' я ввожу текст '1 000,00'

           И в таблице "Товары" я завершаю редактирование строки





    И я заполняю этапы оплаты заказа по графику платежей

           

            И я перехожу к закладке "Основное"

            И я нажимаю на гиперссылку "НадписьЭтапыОплаты"

            Тогда открылось окно 'Правила оплаты'

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЗаполнитьЭтапыГрафикаОплатыТаблица'          

            И я нажимаю на кнопку 'Перенести в документ'





    Когда я провожу этот заказ клиента

   

            И я нажимаю на кнопку 'Провести'

   

    Тогда в регистре “Расчеты с клиентами” появляется две записи с регистратором равным проведенному заказу клиента



            Дано Я открываю основную форму регистра накопления "РасчетыСКлиентами"

            Тогда открылось окно 'Расчеты с клиентами'

            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

           

            И я перехожу к закладке "Отбор"

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я перехожу к строке:
                | 'Доступные поля' |
                | 'Регистратор'    |

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я выбираю текущую строку

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я нажимаю кнопку выбора у реквизита "Значение"

            Тогда открылось окно 'Выбор типа данных'

            И В форме "Выбор типа данных" в таблице "" я перехожу к строке:
                | ''              |
                | 'Заказ клиента' |

            И в таблице "" я выбираю текущую строку

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я перехожу к строке:
                | 'Дата'                | 'Номер'            |
                | '$ДатаДокумента$'     | '$НомерДокумента$' |



            И в таблице "Список" я выбираю текущую строку

            Тогда открылось окно 'Настройка списка'

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я завершаю редактирование строки

            И я нажимаю на кнопку 'Завершить редактирование'

            Тогда открылось окно 'Расчеты с клиентами'



            Тогда в таблице "Список" количество строк "равно" 2



    И среди этих записей есть строка с реквизитами документа, датой оплаты 06.01.2019 и суммой 300



            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '06.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '300,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '06.01.2019 23:59:59' |

   

    И среди этих записей есть строка с реквизитами документа, датой оплаты 07.01.2019 и суммой 700



            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '07.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '700,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '07.01.2019 23:59:59' |





    И я отключаю отбор в списке регистра, чтобы не влиять на другие сценарии



            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

            И я перехожу к закладке "Отбор"

            И я удаляю все строки таблицы "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор"

            И я нажимаю на кнопку 'Завершить редактирование'      

 

 

Посмотрим на результат выполнения обоих сценариев :

 

 

Оба сценария выполняются успешно.

 

В заключение отмечу, что тестирование движений через формы списков регистров - это только один из возможных подходов.

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

 

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

Проверка движений через отчет обладает важным преимуществами :

  • Проверяются всегда все движения и все колонки. Если сценарий устареет из за добавления новых реквизитов, то мы об этом узнаем и адаптируем его, за счет того что он начнёт выдавать ошибки. То есть у такого подхода выше надежность.
  • Можно проверить все движения за раз. При этом можно комбинировать шаги таким образом, чтобы исключить часть строк из проверки. Например не проверять себестоимость товаров, если мы считаем, что это не нужно делать до закрытия месяца.

Но в то же время есть и недостатки

  • Мы не можем отказаться от проверки всех колонок (ячеек) табличного документа в строке, даже если захотим. Мы обязаны перечислить их все, даже пустые ячейки. Иногда это делает описание шага в сценарии очень громоздким.
  • Мы не можем менять порядок проверяемых колонок, перечисляя сначала наиболее важные для нас. Происходит последовательная проверка всех ячеек строки до правой границы табличного документа.
  • Мы не можем использовать подстановку значений из структуры “Контекст”. Если мы передадим для проверки $ДатаДокумента$, то будет искаться именно эта строка, а не значение даты, сохраненное в структуре “Контекст”.

 

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

 

 


 

Ну что же, мы закончили рассмотрение трёх сложных примеров. Надеюсь, что теперь в работе Vanessa-ADD для вас меньше секретов и вы сможете с эффективнее применять этот инструмент для повышения качества разработки на своих проектах.

В следующей части будут разобраны вопросы, которые позволят вам не только использовать Vanessa-ADD “из коробки”, но и значительно расширять её возможности:

  • Создание собственных шагов
  • Создание новых библиотек шагов
  • Экспортные сценарии

 

Не забывайте отмечать публикацию звёздочкой и делиться ссылкой - так вы поможете привлечь внимание сообщества к теме сценарного тестирования и окажете поддержку в выпуске следующих публикаций на эту тему.

 

 

Скачать файлы

Наименование Файл Версия Размер
Присоединенные файлы для ПТУ

.feature 10,34Kb
28.01.19
0
.feature 10,34Kb Скачать
Обмен РИБ через план обмена

.feature 16,24Kb
28.01.19
0
.feature 16,24Kb Скачать
Движения заказа через форму регистра

.feature 30,31Kb
28.01.19
1
.feature 30,31Kb 1 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. script 221 28.01.19 18:45 Сейчас в теме
Капец, какой титанический труд. Мне теперь будет плохо от любых словосочетаний автоматическое тестирование.
3. Vladimir Litvinenko 2363 28.01.19 19:10 Сейчас в теме
(2) Большая часть шагов ведь автоматически записывается. Дальше дело за малым - либо объединить исходный тест-кейс/сценарий c автоматически записанными шагами, либо наоборот, разбить автоматически записанные шаги на логические группы. Некоторые даже и этого не делают, хотя сценарии тогда сложно читать и адаптировать.

И уж точно это проще, чем разработать и запрограммировать механизм. Написание сценария занимает меньше 10% от всей разработки и может выполняться даже не программистом или с его небольшой помощью. Конечно при условии, что разработка ведётся по чётким требованиям, на основе которых можно составить хотя бы тест-кейс. А ещё лучше - сценарий, похожий на тот, что был в начале каждого примера.

Зато потом многие ошибки до продуктива не доходят. Вот например последняя ошибка, которую ловили на нашем CI-контуре как раз была связана с присоединенными файлами. Ошибка, которую трудно обнаружить вручную. Её бы поймали пользователи, процесс ввода нескольких типов документов был бы нарушен, и пришлось бы в срочном порядке обновлять рабочую базу ещё раз.


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

Главная проблема - не написать сценарий, а адаптировать его к изменениям в конфигурации. Чем чаще и масшатбнее меняется функционал, тем больше времени требуется на адаптацию. Об этом собственно уже писал во вводной публикации: https://infostart.ru/public/969637, а вот здесь http://forum.infostart.ru/forum9/topic207123/message2134231/#message2134231 о том же самом писал Денис Олейник. Но это проблема любого тестирования, даже ручного. Оно хорошо работает когда требования к системе изначально поступают обдуманные и не хаотичные. Точно также, как и любая автоматизация.
4. tsukanov 28.01.19 20:16 Сейчас в теме
(3)
Большая часть шагов ведь автоматически записывается


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

Думаю вы это конечно где-то уже говорили. Оставляю тут эту информацию, чтобы картина была полнее.
7. Vladimir Litvinenko 2363 28.01.19 21:59 Сейчас в теме
(4) Не воспринимайте как критику. Просто когда я смотрю, как работают разработчики на других платформах с аналогичными фреймворками, то начинает казаться, что мы в мире 1С вообще избалованы и капризны )) А ведь на других платформах покрытие систем юнит- и функциональными тестами гораздо чаще является нормой, чем в наших процессах разработки. Может быть у них тоже есть какие-то секреты, позволяющие автоматизировать процесс создания функциональных тестов. Но судя по тому, что можно найти в сети, как раз в 1С сейчас одни из самых удобных фреймворков.

https://www.youtube.com/watch?v=xoS-lsbEojk

https://www.youtube.com/watch?v=55vJUqHSbkQ
8. tsukanov 28.01.19 22:15 Сейчас в теме
(7) Не понял что я вообще мог принять за критику ) Ну да ладно (вы вроде всегда максимально тактичны).

К чему вы привели видео не понял, ведь на них вроде программисты )
Для программиста и голое API платформы вполне норм. А если хочется быстро и удобно, то берешь Тестер и погнал.

Мой коммент был не про программистов, а про вероятных пользователей записывалки шагов (тестировщиков и аналитиков).
9. Vladimir Litvinenko 2363 28.01.19 22:29 Сейчас в теме
(8) Комментарий выше и ссылки на видео были к тому, что похоже именно фреймворки для 1С сейчас дают возможность максимально автоматизировать функциональное и сценарное тестирование. По сравнению с инструментами для других платформ. Особенно это касается подходов с использованием Gherkin, которые в случае 1С позволяют заниматься сценарным тестированием и созданием исполняемой документации с минимальным знанием программирования.

Простейшие сценарии ведь вообще без программирования можно создать, только адаптировать их потом чаще придётся.

"Тестер" тоже для 1С, и "Тестирование 3.0". У нас сейчас очень классные инструменты есть. Кажется, что специалистам на других платформах намного сложнее приходится с решением тех же вопросов. Они глубже в техническую сторону вопроса должны погружаться.
10. tsukanov 28.01.19 22:39 Сейчас в теме
(9) Я походу переутомился. Не понимаю что мне пишут )

Я понял, что не понял вас до этого, но теперь не могу понять этот коммент.
Пойду посплю, пожалуй ) Переработал )
Vladimir Litvinenko; +1 Ответить
11. Vladimir Litvinenko 2363 28.01.19 22:51 Сейчас в теме
(10) Хорошая мысль. Поступлю аналогично ))
5. tsukanov 28.01.19 21:27 Сейчас в теме
Владимир, сделайте, пожалуйста, оглавление. Вы выдаете огромные объемы, но не учитываете, что читать это целиком мало кто решится. Очень тяжело без навигации. И код наверно лучше в спойлеры спрятать.
6. Vladimir Litvinenko 2363 28.01.19 21:52 Сейчас в теме
(5) Предыдущие публикации были с подробным оглавлением. Но здесь сквозные примеры, их сложно разбить на составляющие. В рамках одного примера все действия плавно перетекают одно в другое.

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

Больше таких длинных примеров приводить не планирую, их здесь уже четыре штуки накопилось, учитывая первую часть. Следующая публикация будет для разработчиков. По теме реализации своих шагов, библиотек и экспортных сценариев. Там точно получится сделать нормальную структуру и оглавление.
12. grumagargler 664 28.01.19 23:38 Сейчас в теме
Прошу не делать вывод на основе приводимых примеров о чрезмерной сложности Vanessa-ADD для практического применения


Владимир, отлично, пошли примеры. Но почему не делать выводы, ведь это важно с точки зрения применимости технологии. Так или иначе (даже если его упростить), думаю невооруженным взглядом видно, например, почему простой по сути и очень сложный по форме, является первый сценарий. Безотносительно к вашему труду, а лишь правды ради - назвать сложным сценарий “прикрепления файла к документу” ну ведь никак нельзя. Уверен, вы ожидали подобный комментарий-придирку о недостаточной сложности, но ведь именно в этом и вся суть, а в не в многообещающей методологии.
Для контраста, вот как ваш первый тест выглядит в Тестере:
// Проверка присоединения файла к документу ПоступлениеТоваровУслуг
исходнаяКартинка = "c:\pic1.png";
сохраненнаяКартинка = "c:\pic1_сохраненный.png";

Подключить ();
ЗакрытьВсе ();

// Создаем и записываем документ
Коммандос("e1cib/command/Документ.ПоступлениеТоваровУслуг.Создать");
Здесь();
Нажать("!ФормаЗаписать");

// Открываем список файлов и загружаем картинку
Нажать("Файлы", ПолучитьСсылки());
Здесь();
Приложение.УстановитьРезультатДиалогаВыбораФайла(истина, исходнаяКартинка);
Нажать("!Добавить");

// Выгружаем картинку из бызы предварительно удалив её на диске и проверяем успешность выгрузки
УдалитьФайлы(сохраненнаяКартинка);
Приложение.УстановитьРезультатДиалогаВыбораФайла(Истина, сохраненнаяКартинка);
Нажать("!ФормаСохранитьКак");
файл = Новый Файл(сохраненнаяКартинка);
если не файл.Существует() тогда
	Стоп("Файл " + сохраненнаяКартинка + " не найден");
конецесли;
Показать
JohnyDeath; +1 Ответить
13. Vladimir Litvinenko 2363 29.01.19 00:19 Сейчас в теме
(12) Уверен, каждый инструмент найдёт свою нишу.

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

Но в этом случае мы лишимся главного преимущества Ванессы - человекочитаемости вплоть до каждого элементарного действия и объединения в одном месте тест-кейса и исполняемого сценария. Опять же, есть те, кто BDD использует или стремится к этому подходу. Для них пока нет альтернатив, кроме проектов, основанных на Vanessa-Behavior. Ведь в этом случае сценарий - это еще и часть документации по системе, а не только регрессионные тесты.

С другой стороны видео, записанное для демонстрации возможностей Тестера, тоже показывает достаточно большое количество ручных операций и программирования: https://www.youtube.com/watch?v=ZyqQ-YjKB3A. И в документации http://www.test1c.com/#ReplayErrors также сказано о том, что не всегда с первого раза получается записать сценарий, который воспроизводится без ошибок. И дана рекомендация записывать накликиванием короткие сценарии, а затем дополнять их кодом.


Просто у каждого инструмента своё назначение. Программисту для регрессионного тестирования наверное будет удобно "Тестер" использовать. Я вот смотрю в документацию и видео-примеры и понимаю, что удобно. Но я разработчик. А если аналитиков подключать или QA, то надо уже думать, смогут ли они адаптировать сценарии к изменениям в системе, когда это понадобится (а ведь точно понадобится, система - штука живая).

Ещё у Тестера есть неоспоримое преимущество - документация по инструменту, очень хорошая. Лучшая из всех имеющихся инструментов и программисту очевидно легко изучить будет. Я вот пытаюсь восполнить этот недостаток у Ванессы.

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

Нет ли у Вас в планах записать такое видео или публикацию сделать? Например для типовой конфигурации, так как это наиболее актуально. Или может быть оно уже есть, а я пропустил?
grumagargler; +1 Ответить
14. grumagargler 664 29.01.19 00:53 Сейчас в теме
Спасибо за поддержание конструктива!
Нет ли у Вас в планах записать такое видео или публикацию сделать? Например для типовой конфигурации, так как это наиболее актуально. Или может быть оно уже есть, а я пропустил?

Да, такой пример я рассматривал, вот ссылка Тестер, практический пример
На счет человеко-читаемости. Сложный вопрос. К примеру, такие шаги: “Это необходимо чтобы в списке файлов появилось две строки и мы могли автоматически записать шаг”, “И я запоминаю значение поля с именем "Номер" как "НомерДокумента"” и другие, накапливают особенности и соглашения, а сам (общий, даже с учетом возможности подшагов) объем сценария растет серьёзно с ростом кол-ва тестируемых объектов. В итоге получается, что ну ведь не сложный сценарий прикрепления файла, через призму кнопконаждималки + человеко-понятности, делает этот сценарий совсем уже не простым.
В тестере, кнопконажимался была реализована для быстрого входа в систему, реальные тесты, насколько я знаю, со временем люди начинают писать руками.
1ceo_2015; Vladimir Litvinenko; +2 Ответить
15. Pr-Mex 125 30.01.19 18:05 Сейчас в теме
(14)
Вы сами решаете на каком уровне детализации остановиться.
Можно создать сценарий вообще с одним шагом "Сделать всё" и спрятать детали реализации внутрь.
22. grumagargler 664 30.01.19 18:42 Сейчас в теме
(15) можно и вручную протестировать, можно обработками и многими другими способами. Но речь об удобстве применения инструмента, а не только о его теоретических возможностях, а это включает в себя оперативный и понятный анализ падений, оперативность рефакторинга, оперативный запуск и обмен сценариями других программистов команды, запуск сценариев во время разработки при каждом F5, без необходимости очистки базы и многое-многое другое, запуск сценариев в фоне и многое другое. В свое время, я приложил достаточно усилий (со своей точки зрения) чтобы получить требуемый уровень комфорта в работе и качестве результата используя сценарное тестирвоание и ванесса-инструменты, не получилось. Затем посмотрел в код нескольких обработок "по промышленным стандартам", затем часовые видео о том, как настраивать окружение, и почти ничего а самом тестировании и пришел к выводу, что продолжать бесполезно, нужно делать самим. И я без претензий, никто ведь никому ничего не должен, но для конструктивного продолжения разговора, подскажите пожалуйста, где найти видео-или-документацию с разбором практического примера, по сути не уступающей разбору в этой ссылке Тестер, практический пример
23. Pr-Mex 125 30.01.19 18:48 Сейчас в теме
(22)
Но речь об удобстве применения инструмента, а не только о его теоретических возможностях, а это включает в себя оперативный и понятный анализ падений, оперативность рефакторинга, оперативный запуск и обмен сценариями других программистов команды, запуск сценариев во время разработки при каждом F5, без необходимости очистки базы и многое-многое другое, запуск сценариев в фоне и многое другое.


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

Это, на мой взгляд, всё реализуемо и в Ванессе (как бы она не называлась).

Я не встречал развёрнутого комментария по этим темам, что вы попробовали - но не получилось то-то и то-то.
24. grumagargler 664 30.01.19 19:06 Сейчас в теме
(23)
Это, на мой взгляд, всё реализуемо и в Ванессе (как бы она не называлась).

Возможно так и есть, но мне этим овладеть не удалось, во всяком случае в моем понимании процесса.
Я не встречал развёрнутого комментария по этим темам, что вы попробовали - но не получилось то-то и то-то.

я их не писал, а должен был? мне хватило информации, которой я почерпнул из открытых источников.
28. Pr-Mex 125 31.01.19 11:31 Сейчас в теме
(24)
я их не писал, а должен был? мне хватило информации, которой я почерпнул из открытых источников.


У меня сложилось впечатление, что вы попробовали - но не получилось.
В открытых источниках информация может быть противоречивой.
Вы можете смело спрашивать, например, у меня по возможностям Ванессы и как реализовать тот или иной патерн.
16. Pr-Mex 125 30.01.19 18:08 Сейчас в теме
(0)
В заключение отмечу, что тестирование движений через формы списков регистров - это только один из возможных подходов.


Не рекомендую проверять движения регистра на прямую.
Лучше проверять отчеты.
Структура регистра может сто раз ещё поменяться, но отчет будет меняться синхронно с ним и будет учитывать эти изменения регистра.
1ceo_2015; Vladimir Litvinenko; +2 Ответить
25. Vladimir Litvinenko 2363 30.01.19 20:10 Сейчас в теме
(16) Да, тоже отметил в конце публикации, что проверка через отчет гораздо надёжнее.

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

Может быть зря так перегружаю информацией, но всё таки публикации нацелены на тех, кто хочет научиться применять разные приёмы, а не просто прочитать про базовые возможности. Надеюсь что тем, кто серьёзно нацелен на применение Ванессы эта информация будет полезна. Как и информация из комментариев.
17. Pr-Mex 125 30.01.19 18:11 Сейчас в теме
(0)
# Даем 20 секунд на завершение обмена


Это странное решение. Лучше так не делать, а ждать асинхронного события.
Я сам писал сценарий для тестирования обмена в РИБ и точно могу сказать, что паузы при синхронизации не нужны.
26. Vladimir Litvinenko 2363 30.01.19 20:19 Сейчас в теме
(17) Леонид, не могли бы Вы пожалуйста написать, как следовало поступить в этом случае? Явная установка паузы - это единственное решение, которое я нашёл в случае применения встроенной библиотеки шагов.

Есть ещё шаг
Дано Ожидаем завершения фонового формирования отчета в течение "10" секунд

У этого шага есть пояснение
Шаг работает только когда TestManager и TestClient работают в одной и той же базе. Шаг ждёт указанное время, что завершились активные фоновые задания.

Согласно пояснению это подходящий для ожидания завершения обмена шаг. Но его название не соответствует тому, что от него бы потребовалось в данном случае. Поэтому показалось, что выхода два - создавать новый шаг на основе существующего (а эту тему ещё не рассматривали, она будет дальше) или применить паузу.
29. Pr-Mex 125 31.01.19 11:35 Сейчас в теме
(26)
Ок. Постараюсь показать на примере.
30. Pr-Mex 125 01.02.19 10:45 Сейчас в теме
(26)
Дано Ожидаем завершения фонового формирования отчета в течение "10" секунд


Этот шаг, как вы правильно написали, работает на стороне TestManager.
Мы его не используем, т.к. в качестве TestManager используем пустую базу, а не ERP.


У меня в сценарии используется шаг, ожидающий появления элемента:

И я нажимаю на кнопку с именем 'СписокПриложенийВыполнитьСинхронизацию'
Тогда открылось окно 'Синхронизация данных с*'
И я жду появления элемента с именем "ЗавершениеОбмена" в течение 100 секунд
Andrei_Zoteev; Vladimir Litvinenko; +2 Ответить
31. Vladimir Litvinenko 2363 01.02.19 12:34 Сейчас в теме
18. Pr-Mex 125 30.01.19 18:13 Сейчас в теме
(0)
Мы не можем отказаться от проверки всех колонок (ячеек) табличного документа в строке, даже если захотим. Мы обязаны перечислить их все, даже пустые ячейки. Иногда это делает описание шага в сценарии очень громоздким.


1) можно проверять область макета
2) есть шаги, которые не зависят от порядка строк и в таблицах и в макетах
19. Pr-Mex 125 30.01.19 18:14 Сейчас в теме
(0)
Мы не можем использовать подстановку значений из структуры “Контекст”. Если мы передадим для проверки $ДатаДокумента$, то будет искаться именно эта строка, а не значение даты, сохраненное в структуре “Контекст”.


В Vanessa-Automation это работает. Можно в ячейке указывать $ДатаДокумента$.
Andrei_Zoteev; Vladimir Litvinenko; +2 Ответить
27. Vladimir Litvinenko 2363 30.01.19 20:23 Сейчас в теме
(19) Классно. Хотел в следующий раз на этом примере продемонстрировать, как можно сделать собственный шаг на основе существующего. Теперь знаю, что сначала лучше посмотреть на реализацию в Vanessa-Automation ))
32. AntonSm 27 18.03.19 09:49 Сейчас в теме
(19) подскажите, пожалуйста, по использованию такого шага:
"И табличный документ формы с именем "РеквизитТабличныйДокумент" содержит строки:
| Значение1 | Значение2 |
| Значение3 | Значение4 |"

Как правильно написать проверку строки, чтобы задействовать ранее сохраненные переменные?
Хочется сохранить дату и номер документа, а потом проверить, что строка с документом есть в отчете по структуре подчиненности.

Пробовал несколько вариантов, но не смог найти как сделать.

Первый вариант:
И табличный документ "ТаблицаОтчета" содержит значения:
| 'Перемещение товаров $НомерДокумента$ от $ДатаДокумента$' |

Второй вариант:
И табличный документ формы с именем "ТаблицаОтчета" содержит строки:
| '' | 'Перемещение товаров $НомерДокумента$ от $ДатаДокумента$' | '' |
20. Pr-Mex 125 30.01.19 18:14 Сейчас в теме
21. Pr-Mex 125 30.01.19 18:15 Сейчас в теме
(0)
Ещё в макетах можно указывать симол *, тогда ячейка не будет участвовать в сравнении.
33. alx1c 04.08.19 20:28 Сейчас в теме
1. Как сменить каталог для фич, который Ванесса сама определяет по умолчанию?
2. Как удалять фичи из дерева с родителем "vanessa-add-temp.feature"?
3. Как сделать, чтобы фичи записывались в разные файлы, а не только в "vanessa-add-temp.feature"?

+ вечно сыпятся ошибки, использую версию 6.0.0:
1. При записи тест клиента с кнопки "начать запись действий пользователя" всегда выдается сообщение "04.08.2019 21:40:39 Порт 48 000 занят или находится вне указанного диапазона, порт подключения изменен на 48 001". В итоге запись действий не выполняется.
Сделал по другому:
Сначала нажимаю кнопка "Запустить тест-клиент", затем нажимаю "начать запись действий пользователя" - вроде работает, но при попытке воспроизвести тест с прикреплением файла падают ошибки:
1. в тест клиенте "ошибка записи XML"
2. В основном сеансе:
ЗавершитьЗаписьДействийПользователя:{ВнешняяОбработка.bddRunner.Форма.УправляемаяФорма.Форма(3076)}: Ошибка при вызове метода контекста (ЗавершитьЗаписьЖурналаДействийПользователя): Ошибка сетевого взаимодействия при вызове.
34. alx1c 04.08.19 21:13 Сейчас в теме
И еще один вопрос:
Редактирую фичу через VS, затем перезагружаю ее, но сама фича не меняется, т.е. как ее первый раз Ванесса запомнила, так вся фича и выглядит.
Открываю фича файл - там удаленные мной шаги удалены, я не сошел с ума..
35. artkor 128 15.01.20 16:20 Сейчас в теме
Спасибо большое за отличные статьи по Ванессе! Подскажите, можно ли обойти как-то шаг "Дано Я подключаю клиент тестирования с параметрами..." на случай если сторонняя база на другой платформе работает? Ругается на несовместимость платформ на клиенте тестирования.
36. Vladimir Litvinenko 2363 16.01.20 13:33 Сейчас в теме
(35) Видимо это ограничение платформы. Она ведь у нас очень чувствительная к разнице версий различных компонент: клиента и сервера, сервера и консоли администрирования, сервера хранилища и конфигуратора. Обязательно всё должно быть на одной платформе.

Я сейчас для реализации механизмов тестирования переехал на Linux на виртуальных машинах, где платформа 1С вообще одна ставится. Вопрос тестирования на разных платформах решается простым поднятием еще одной виртуалки из образа, включающего другую версию платформы. Машины на Linux + PostgreSQL очень компактны и такое решение оказывается удобным. VA в этом случае работает медленнее (из за особенностей платформы) но зато возможностей намного больше.

Если задача заключается в тестировании на разных версиях платформы, то может быть стоит попробовать такой способ?
37. artkor 128 17.01.20 09:32 Сейчас в теме
(36) К своему стыду никогда не "баловался" виртуалками. Скажите, Вы virtualBox или vmVare используете? И где эти готовые образы "Linux + PostgreSQL" можно взять (если они не закрыты конечно) ? Просто чтобы понимать куда "копать".
38. Vladimir Litvinenko 2363 17.01.20 16:02 Сейчас в теме
(37) Образы самостоятельно готовить надо. В них ведь ещё платформа 1С должна быть и сборка PostgreSQL желательно должна быть именно для 1С - либо с сайта ИТС , либо от команды Postgres Pro (хотя фактически они все от Postgres Pro).

В простейшем случае можно вручную настроить несколько виртуалок с нужным составом программного обеспечения и просто копировать их. Можно просто как файлы, можно через экспорт и импорт. Это чтобы не бояться сломать их и чтобы можно было несколько узлов для CI делать.

Я использую для этого Packer, Vagrant и VirtualBox. Для VirtualBox это сочетание бесплатно, для VMWare платно. Packer и Vagrant позволяют автоматизировать весь процесс и быстро разворачивать сразу набор виртуальных машин.

Вы можете подписать на публикации от моего аккаунта, через какое-то время будут материалы на эту тему. Правда не могу сейчас сказать когда именно. Наверное отпуск нужен, руки не доходят довести публикацию до ума )) Но обязательно доведу как только появится свободное время ))
39. artkor 128 17.01.20 19:56 Сейчас в теме
(38) спасибо за развернутый ответ. Кое-что понятно но пока не все). Если будет статья на данную тему обязательно прочтем )
40. Spakus 01.04.20 09:53 Сейчас в теме
Добрый день.
Владимир, у нас в компании конфигурация написана на обычных формах, поэтому нет возможности использовать функциональность кнопконажималки. Приходится все писать вручную.

Подскажите, пожалуйста, можно ли в ванессе осуществить ветвление?

Например, у меня есть некая переменная, значение которого я получил на одном из шагов тестирования и сохранил в контекст. В зависимости от значения этой переменной у меня должен отличаться алгоритм следующего шага.
Если "Переменная > 5", то "Я выполняю действие 1"
Если "Переменная < 5", то "Я выполняю действие 2"
42. Andrei_Zoteev 27.05.20 18:53 Сейчас в теме
(40)
На сколько я понимаю, это обычный механизм условий.
Посмотрите видео: https://www.youtube.com/watch?v=1UBlV4kWx_o&t=825s Леонид Паутов записывал, там об этом говориться немного. Да и вообще очень полезный материал!
41. Olenevod 24 01.04.20 12:29 Сейчас в теме
Интересно, а нет ли где примеров различных фич файлов?
Пробую сотворить сценарии, но возникают различные трудности. Так-то если смотреть какие-то примеры, то вытащить можно некоторые полезные вещи, а самое главное понять и запомнить как можно писать.
43. Andrei_Zoteev 27.05.20 19:02 Сейчас в теме
(41) Если не критично именно Vanessa ADD, то на данном канале https://www.youtube.com/channel/UC114RqHhG__1gET8pzs3AHA есть видео с описанием возможностей Vanessa automation! В описании как правило есть ссылки в GitHub на фичи для видео. Из них можно что то подчерпнуть, я например подглядываю в них когда пишу фичи для видеоинструкций.
44. Andrei_Zoteev 27.05.20 19:05 Сейчас в теме
(0)Владимир, спасибо!

Я правда не поял зачем Вы в третьем примере писали в контекст столько шагов, видимо это сделано для лучшего понимая цели документа?
Оставьте свое сообщение

См. также

Безопасная работа с транзакциями во встроенном языке Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Разбираемся с опасностями использования транзакций во встроенном языке 1С. Познаем ошибку "В данной транзакции уже происходили ошибки". Учимся защищаться от них.

1 стартмани

25.03.2019    33121    tormozit    44    

Загрузка, скачивание, удаление файлов с помощью НачатьПомещениеФайлаНаСервер() и НачатьПолучениеФайлаССервера()

Практика программирования v8 1cv8.cf Абонемент ($m)

В платформе 8.3.15 появились новые методы НачатьПомещениеФайлаНаСервер() и НачатьПолучениеФайлаССервера(). В данной статье рассмотрено готовое решение проверенное и прекрасно работающее на тонком и веб-клиенте.

1 стартмани

25.07.2020    1573    Flashill    9    

Параллельные вычисления расчета факториала числа N

Практика программирования v8 1cv8.cf Абонемент ($m)

Распараллеливание алгоритма с помощью фоновых заданий (асинхронные вычисления)

1 стартмани

29.06.2020    2145    Rustig    17    

Методика обновления формы объекта данных при изменении объекта

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

В формах объектов данных часто встречаются элементы, косвенно связанные с объектом. Логику обновления этих элементов при изменении объекта обычно вызывают из обработчиков ПриСозданнииНаСервере и ПриОткрытии, забывая про наличие других способов изменения объекта. В статье предложена методика для обычных и управляемых форм, учитывающая все способы.

1 стартмани

09.03.2020    6878    tormozit    13    

Как выполнить отчет на СКД через COM и получить данные отчета? Промо

Практика программирования v8 УПП1 Россия Абонемент ($m)

Для чего это нужно. Например, нужно в одной базе получить какой-либо показатель из другой базы. Этот показатель вычисляется в каком-либо сложном отчете, который написан на СКД. Можно, конечно, "скопипастить" текст запроса из другой базы, немного подправить его и выполнять в том же COM подключении. Но с этим теряется гибкость: если отчет изменился, то нужно помнить о том, что где-то есть его "немного модифицированная" копия. В статье будет рассмотрен пример получения данных из базы ЗУП.

2 стартмани

08.05.2018    26627    wowik    3    

Отправка уведомлений с помощью командной строки, Оповещения с сервера на клиент с помощью командной строки

Практика программирования v8 1cv8.cf Россия Абонемент ($m)

Отправка уведомлений с помощью команды командной строки msg. Оповестить пользователей из серверного модуля или регламентного задания, с помощью командной строки msg.

1 стартмани

05.03.2020    5056    user5300    3    

Вывод сообщений в HTML поле средствами 1С

Практика программирования v8 v8::УФ Абонемент ($m)

Пример использования вывода большого количества сообщений в поле HTML. С возможностью открывать ссылочные объекты и создавать новые объекты передавая параметры прямо из HTML поля. Протестировано на релизах 8.3.12 и 8.3.15+

2 стартмани

31.01.2020    5201    burni4    16    

Краткое руководство по внесению изменений в конфигурацию

Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

13.01.2020    15926    sapervodichka    41    

Как нарисовать граф на 1С Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

09.08.2013    69841    ildarovich    117    

Универсальные функции: разложение произвольной строки адреса в структуру

Практика программирования Универсальные функции v8 1cv8.cf Абонемент ($m)

Процедуры и функции раскладывают произвольную строку адрес в структуру по ключевым словам.

1 стартмани

30.12.2019    3267    vik070777    10    

Vanessa Automation + СППР

Vanessa Automation СППР v8 Бесплатно (free)

Vanessa Automation. Использование автоматизированного тестирования в СППР.

07.11.2019    11768    SvVik    14    

"Живые" картинки со Snap.SVG

Практика программирования WEB Работа с интерфейсом v8 Абонемент ($m)

В статье рассмотрен пример использования http-сервисов для визуализации данных

1 стартмани

24.10.2019    12919    blackhole321    7    

Простой способ индексирования интервалов Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

28.09.2016    39060    ildarovich    22    

RLS - дубли условий в запросах к СУБД

Практика программирования Роли и права v8 v8::Права 1cv8.cf Абонемент ($m)

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

1 стартмани

07.10.2019    8126    geron4    4    

Полезные процедуры и функции для программиста

Практика программирования Универсальные функции v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

07.10.2019    28164    HostHost    40    

Полное копирование одной формы в другую

Практика программирования Универсальные обработки Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Однажды я столкнулся с необходимостью открыть форму ЛЮБОГО документа с определенными изменениями, не зависящими от структуры объекта (например, заблокировать все кнопки). В интернете решения я не нашел. Обычно на форумах на запросы подобного рода отвечают чем-то вроде "покажи первоначальную задачу, а не спрашивай как реализовать то, что ты придумал". Тем не менее, мне стало интересно, как это можно сделать.

1 стартмани

03.10.2019    4545    nekit_rdx    23    

Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.

1 стартмани

01.02.2018    34601    rpgshnik    49    

Многопоточная обработка данных на примере перепроведения документов

Обработка документов Практика программирования v8 ERP2 УТ11 КА2 Абонемент ($m)

Дальнейшее развитие темы фоновой обработки данных - проведение документов в потоках. Настройка параметров и запуск основного процесса (менеджера потоков). Разбивка документов для проведения на не связанные друг с другом наборы и запуск дополнительных фоновых заданий для отдельных потоков. Отслеживание выполнения каждого потока в родительском сеансе.

1 стартмани

17.09.2019    8662    ids79    46    

Отображение истории выполнения по всем задачам комплексного процесса в документообороте

Документооборот и делопроизводство Практика программирования v8 ДО Абонемент ($m)

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

1 стартмани

15.09.2019    6427    pavelpribytkin96    8    

Описание формата внутреннего представления данных 1С в контексте обмена данными

Практика программирования Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

Фирма 1С не рекомендует использовать внутреннее представление данных для любых целей, которые отличны от обмена с 1С:Предприятием 7.7. Но сама возможность заглянуть на "внутреннюю кухню" платформы с помощью функций ЗначениеВСтрокуВнутр(), ЗначениеВФайл(), ЗначениеИзСтрокиВнутр() и ЗначениеИзФайла(), дала возможность сообществу программистов 1С разработать новые приемы разработки и анализа. Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.

1 стартмани

06.09.2019    18683    Dementor    30    

БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному Промо

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

1 стартмани

10.05.2018    43258    dsdred    36    

Удобный просмотр результата запроса с большим количеством временных таблиц

Практика программирования v8 Абонемент ($m)

Если Вам часто приходится просматривать в отладчике сложные пакетные запросы с большим количеством временных таблиц, то эта статья для Вас.

1 стартмани

27.08.2019    10562    ids79    21    

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

Практика программирования v8 1cv8.cf Абонемент ($m)

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

2 стартмани

24.08.2019    9767    BenGunn    22    

Изменяющееся контекстное меню в 1С 8.3

Практика программирования Работа с интерфейсом Разработка v8 v8::УФ Абонемент ($m)

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

1 стартмани

06.08.2019    14742    signum2009    16    

Некоторая работа с данными через COM Промо

Практика программирования v8 Абонемент ($m)

В статье приведены примеры работы с Платформой 8.X через COM (точнее, через объект COMConnector). Примеры кода были использованы при реализации прикладных задач в процессе трудовой деятельности.

2 стартмани

05.12.2012    56910    wowik    32    

Процедура ПриКомпоновкеРезультата

Практика программирования v8 1cv8.cf Абонемент ($m)

Коллекция кода

1 стартмани

26.07.2019    34684    vasilev2015    63    

10 способов получить модуль числа (а может, и больше)

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

Пишем функцию вычисления модуля числа. Сколько способов существует? Давайте посчитаем!

1 стартмани

11.07.2019    7249    sam441    29    

Ловец дедлоков СУБД

Производительность и оптимизация (HighLoad) Практика программирования Разработка v8 Россия Абонемент ($m)

Анализ простейшего дедлока СУБД в рабочей базе с использованием ЦУП (центра управления производительностью) и profiler MS SQL (Microsoft SQL Server). Эта статья будет полезна людям, изучающим вопросы оптимизации работы 1С, или тем, у кого возникают дедлоки в рабочей базе. UPD 09.07.2019 добавлено воспроизведение блокировки в случае установки управляемой блокировки перед чтением набора записей регистра сведений. UPD 10.07.2019 добавлена тестовая база с примером.

1 стартмани

08.07.2019    10720    azazana    79    

Работа со схемой запроса Промо

Инструментарий разработчика Практика программирования v8 v8::Запросы Абонемент ($m)

Стандартом взаимодействия с реляционной базой данных стал язык SQL. Приемником SQL в 1С является язык запросов. Язык запросов, также как и SQL, является структурированным. Составляющие структуры запроса отвечают на разные вопросы о том, какие данные требуется получить и какие манипуляции с множествами данных необходимо произвести при получении. В простых случаях текст запроса можно написать вручную, однако в сложных случаях, а также при программном формировании, - лучше воспользоваться объектной моделью запроса и использовать объект "Схема запроса". В статье дается описание объектной модели и особенностей работы с ней, а также приводится решение, упрощающее взаимодействие с объектом "Схема запроса".

1 стартмани

24.04.2018    42560    kalyaka    34    

Мониторинг производительности и искусственный интеллект

Производительность и оптимизация (HighLoad) Практика программирования Разработка v8 Абонемент ($m)

Расскажем и покажем практически, как использовать искусственный интеллект на страже мониторинга производительности. У вас появится возможность создать собственного помощника Ларису, которая возьмет на себя вопросы по контролю и диагностике состояния обслуживаемой системы.

1 стартмани

01.07.2019    8961    ivanov660    28    

"Убер на складе": динамический расчет маршрутов с учетом реальных расстояний

Учет ТМЦ Практика программирования Учет ТМЦ v8 УУ Абонемент ($m)

Представляю методику и инструмент для динамического расчета маршрутов отбора на высоконагруженных складах для максимального повышения эффективности склада, ускорения проходимости и, как следствие, экономии денег. Это методика и обработка для интеграции в WMS решения. Тестировалось на 1С 8.3.14.1565.

3 стартмани

24.06.2019    14263    informa1555    17    

1С:Ассемблер. Немного летнего веселья!

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

21.06.2019    27612    Evil Beaver    122    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов Промо

Практика программирования Математика и алгоритмы Универсальные функции Производительность и оптимизация (HighLoad) v8 1cv8.cf Россия Абонемент ($m)

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    48518    DarkAn    86    

Простые примеры сложных отчетов на СКД

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

Подписи в отчете. Особенности соединения наборов: как соединить несоединяемое. Остатки на дату и обороты по месяцам в одном отчете. Курс валюты на каждую дату без группировок и соединений в запросе. Отчет с произвольными колонками и с произвольной последовательностью. "Неадекватный отчет".

1 стартмани

12.06.2019    28388    Hatson    22    

Графики работы из БСП

Практика программирования Разработка v8 1cv8.cf Россия Абонемент ($m)

Не очень давно на канале 1С:БСП была опубликована заметка по использованию Графиков работы и Календарных графиков.

1 стартмани

23.05.2019    3032    fenixnow    0    

Создание внешней печатной формы в формате документа Word

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

В статье написано, как создать внешнюю печатную форму (для конфигураций с БСП) в формате Word.

1 стартмани

17.05.2019    11838    ВикторП    20    

Новый запрос и новая таблица значений как функции Промо

Практика программирования v8 Абонемент ($m)

Предлагается две простые функции, использование которых уменьшает объем кода в конфигурациях на платформе «1С:Предприятие 8». Эти функции можно добавлять к своему общему модулю, что сделает процесс программирования более эффективным.

1 стартмани

27.11.2012    44907    ildarovich    46    

Пример настройки шаблонов и реализации печати отчетов в документ MS Word используя функциональную часть "Библиотеки Стандартных Подсистем 1С" (БСП)

Практика программирования Разработка v8 Россия Абонемент ($m)

В конфигурации выбраны и использованы только необходимые объекты библиотеки стандартных подсистем для реализации вывода отчёта, с табличными частями, в документ MS Word. Показан пример создания необходимых областей в шаблоне для вывода параметров в отчёт.

1 стартмани

23.04.2019    5733    olegpkc    11    

Ops средствами 1С:Предприятие

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

23.04.2019    17048    blackhole321    28    

1C + Python + Django Rest Framework + Vue.js. Опыт несложной full-stack разработки

Практика программирования Внешние источники данных Обмен через XML WEB Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

22.04.2019    31422    riposte    63    

Уровни, глубина, прародители, циклы и аналоги запросом Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

В продолжение публикации «Транзитивное замыкание запросом» [http://infostart.ru/public/158512/] добавлены другие варианты использования того же приема. Приведены запросы для быстрого определения уровней всех элементов справочника, максимальной глубины справочника, прародителей произвольных элементов справочника, запрос для быстрого определения циклов (на примере справочника спецификаций «1С:Управление производственным предприятием») и определения множеств аналогов номенклатуры (также на примере конфигурации «1С:Управление производственным предприятием»).

1 стартмани

13.11.2012    110536    ildarovich    98    

Вывод вариантов СКД в таблицы на управляемой форме

Практика программирования Работа с интерфейсом v8 v8::УФ v8::СКД 1cv8.cf Абонемент ($m)

Задача стояла такая: есть 2 различных запроса, результаты которых выгружаются на форму обработки в таблицы значений (далее ТЗ) и программно "соприкасаются" между собой определенным образом (как именно- в рамках данной статьи неважно). Нюанс в том, что запросы должны иметь свой компоновщик настроек и могут интерактивно на форме изменяться пользователем. На оригинальность публикации не претендую - изначально в рамках поставленной задачи пытался найти что-то подобное (уже готовый шаблон) на инфостарте, возможно "плохо искал" ;)

05.04.2019    10533    artkor    1    

[EnterpriseData] Антисвертка характеристик номенклатуры при выгрузке в Бухгалтерию

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 v8::ПВХ КД УНФ БП3.0 Россия БУ Абонемент ($m)

Рассмотрена выгрузка каждой пары значений Номенклатура - Характерстика из УНФ 1.6 в отдельную номенклатуру в Бухгалтерию 3.0 путём доработки правил обмена в формате EnterpriseData.

1 стартмани

27.03.2019    4345    nforce    4    

Интеграция 1С и SharePoint

Практика программирования Разработка v8 УНФ ДО ERP2 БП3.0 УТ11 УХ КА2 Россия Абонемент ($m)

Заказчики поставили задачу автоматизации согласования заявок на оплату в программе 1С:Бухгалтерия предприятия 3.0. Согласно ТЗ, данные должны подтягиваться из действующей электронной системы документаоборота на MS SharePoint (в дальнейшем СЭД MS SP).

1 стартмани

22.03.2019    5177    -I-    4    

Неоплаченные долги при распределении оплаты по правилу ФИФО одним запросом и намного быстрее, чем Вы думали Промо

Практика программирования Дебиторская и кредиторская задолженность Дебиторская и кредиторская задолженность v8 v8::СКД КА1 УТ10 УПП1 УУ Абонемент ($m)

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

1 стартмани

28.02.2014    67671    ildarovich    123    

Легкий "тюнинг" УТ 10.3

Практика программирования Разработка v8 v8::ОУ УТ10 Россия УУ Абонемент ($m)

Вариант программной реализации изменения форм типовых объектов для конфигурации Управление торговлей 10.3.

1 стартмани

15.03.2019    4242    pm74    6    

Пример использования СКД и данных расшифровки на мобильной платформе

Практика программирования Разработка v8 v8::Mobile v8::СКД 1cv8.cf Россия Абонемент ($m)

СКД в мобильном приложении и меню действий на основе данных расшифровки (отчет, совместимый с мобильной платформой 8.3.13.45).

1 стартмани

12.03.2019    5343    majoram    0    

Программное создание реквизита управляемой формы с помощью механизма расширений

Практика программирования Разработка v8 v8::УФ 1cv8.cf Абонемент ($m)

В ЗУП 3 возникла задача добавить реквизит в справочник не внося изменений в конфигурацию. БСП с механизмом дополнительных реквизитов использовать было нежелательно, поэтому был использован механизм расширений. Для вывода данного реквизита на форму добавлять саму форму в расширение не хотелось по ряду причин, описанных ниже. Создание реквизита и элемента формы, соответствующего данному реквизиту было решено сделать программно в самом расширении, следуя принципу минимального воздействия на конфигурацию.

1 стартмани

12.03.2019    32273    ni_cola    29    

Транзитивное замыкание запросом Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

В частности, показывается, как одним пакетным запросом найти ВСЕХ предков (потомков) в иерархическом справочнике. Аналогично можно определять входимость деталей в узлы и готовые изделия по их спецификациям, определять подмножества аналогичных запчастей по цепочке аналогов, решать другие подобные задачи. Приложен файл с примером отчета для замыкания иерархии произвольного справочника, позволяющий протестировать быстродействие запроса в разных условиях.

1 стартмани

29.10.2012    83560    ildarovich    118    

Иерархия библиотек. Автоматическое обновление или как отказаться от переопределяемых модулей

Практика программирования Математика и алгоритмы Разработка v8 Абонемент ($m)

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

1 стартмани

04.03.2019    5618    Alxby    4    

Асинхронная работа с текстовыми файлами в 1С 8.3

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

В этой статье я рассмотрю основные моменты работы с текстовым файлом в 1С 8.3. (загрузка - выгрузка) в режиме отключенной модальности (асинхронно).

1 стартмани

28.02.2019    7003    signum2009    6    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    20994    Vladimir Litvinenko    27