Имя: Пароль:
1C
1С v8
Какой параметр передать в форму документа, чтобы нажать кнопку Записать Провести Закрыть?
,
0 Мимохожий Однако
 
24.12.21
11:12
1. Есть другие пути 67% (2)
2. Такое невозможно 33% (1)
3. Надо искать экспортную процедуру формы 0% (0)
4. Без расширения не обойтись 0% (0)
5. Надо сляпать скрипт нажатия кнопок 0% (0)
6. Использовать режим сценарного тестирования 0% (0)
Всего мнений: 3

Сегодня неожиданно поступил от клиента данный вопрос. Конфигурация КА 2.4. Хотят провести некий массив через открытие формы по кнопке ОК.
Я не смог ответить сходу. Надеюсь в пятницу будет счастье.
1 Мимохожий Однако
 
24.12.21
11:13
Я "не шмогла"

Такое невозможно
2 Ёпрст
 
24.12.21
11:13
(0) а форму то нахрена открывать ?
Гений1с покусал там кого ?
3 PuhUfa
 
24.12.21
11:14
(0) Кнопка "ОК" это чья кнопка?
4 youalex
 
24.12.21
11:14
ЗаписатьВФорме(<РежимЗаписи>)  ?
5 Мимохожий Однако
 
24.12.21
11:14
(2)Возможно ) Общался с клиентами по удалёнке
6 Мимохожий Однако
 
24.12.21
11:16
(3) Как я понял. Это типовая кнопка "Провести и закрыть". Когда они перепроводили документы по правой клавиши из списка документов, эффект проведения был другой. А когда открывали и проводили, то "всё вставало как надо"
7 PLUT
 
24.12.21
11:17
(2) встречал г.внокод, когда магия на клиенте в форме документа происходит по кнопке ОК :)
8 Kassern
 
24.12.21
11:18
(6) ну так сравните чем отличаются эти 2 процесса проведения. Если там, что-то заполняется при открытии, или при записи на форме, то делайте это програмно в обработке и тупо Записать(РежимЗаписи.Проведение)
9 PuhUfa
 
24.12.21
11:18
(6) ну тогда надо найти отличие в "проведении" из формы... исправить этот г.внокод, взять за это 2500руб/час и не пытаться допиливать "это" -)
10 Ryzeman
 
24.12.21
11:19
Посмотреть что за хрень наколхозили на форме и выкинуть в нормальную подписку на событие. Програмное открытие формы и нажатие "ок" - это бороться с огнём маслом.

Есть другие пути
11 Kassern
 
24.12.21
11:20
(8) Самый простой способ, посмотрите как заполнен ЭтотОбъект в модуле объекта при записи из формы и как он заполнен при записи программно

Есть другие пути
12 Базис
 
naïve
24.12.21
11:21
По-правильному, конечно, так как сказали коллеги.

Тяп-ляп - VBS с примерно таким кодом:

пауза, цикл, Sendkey [Ctrl+Enter] с задержкой, Sendkey [Down].
13 Мимохожий Однако
 
24.12.21
11:21
(10) По словам клиентов, всё типовое. Как будет доступ к базе-посмотрю, проверю. А какая подписка наиболее близка к данной ситуации?
14 pechkin
 
24.12.21
11:26
Форма.Записать(СтруктураПараметров)
15 pechkin
 
24.12.21
11:27
Классический дымовой тест
16 Мимохожий Однако
 
24.12.21
11:27
(4) Кстати. Открыл типовую демо КА2.4 и нашёл в общем модуле ОбменСКонтрагентамКлиент любопытный кусочек
#Если ТолстыйКлиентОбычноеПриложение Тогда
        РезультатПроверки = Неопределено;
        ОбменСКонтрагентамиКлиентПереопределяемый.ОбъектМодифицирован(Объект, Форма, РезультатПроверки);
        Если РезультатПроверки = Неопределено Тогда
            
            Если Форма.Модифицированность ИЛИ НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
                
                Проведен    = Метаданные.Документы.Содержит(Объект.Метаданные()) И Объект.Проведен;
                СтрПроведен = ?(Проведен, НСтр("ru = 'записать и провести.
                |Записать и провести?'"), НСтр("ru = 'записать.
                |Записать?'"));
                
                ШаблонСообщения = НСтр("ru = 'Документ изменен. Для формирования электронного документа его необходимо %1'");
                ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, СтрПроведен);
                
                ДополнительныеПараметры = Новый Структура();
                ДополнительныеПараметры.Вставить("СсылкаНаОбъект", Объект.Ссылка);
                ДополнительныеПараметры.Вставить("ИмяКоманды", ИмяКоманды);
                ДополнительныеПараметры.Вставить("Форма", Форма);
                ДополнительныеПараметры.Вставить("Проведен", Проведен);
                
                Обработчик = Новый ОписаниеОповещения( "ЗаписатьВФорме", ЭтотОбъект, ДополнительныеПараметры);
                
                ПоказатьВопрос( Обработчик, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена, , КодВозвратаДиалога.Отмена,
                    НСтр("ru = 'Документ изменен.'"));
                
            КонецЕсли;
        КонецЕсли;
    #КонецЕсли
17 Мимохожий Однако
 
24.12.21
11:28
(14) А что положить в СтруктураПараметров?
18 pechkin
 
24.12.21
11:34
(17) РежимЗаписи, РежимПроведения
19 Ryzeman
 
24.12.21
11:35
(13) Смотря что "встаёт". Если там автоматически заполняются какие-то обязательные реквизиты, то ПередЗаписью, наверное. Никто же пока не знает что там у них не так в принципе и в чём разница между проведением через форму и не через форму.

А то, что проведение отличается в типовой - как-то совсем невероятно. Я с типовой КА не имел дел, но отказываюсь верить, что 1с могут написать так криво.
20 Kassern
 
24.12.21
11:36
(12) Вот вам пятничное решение на питоне))
x, y = pyautogui.position()
pix = pyautogui.pixel(x, y)
Получили координаты и цвет пикселя нужного (кнопка провести и закрыть). А дальше все просто, передаем комбинацию ктрл+ентер, либо курсор наводим и кликаем программно. После этого проверяем по пикселю, что открылась форма списка и передаем вниз и энтер и ищем снова кнопку провести и закрыть. Лучше конечно еще номер с датой проверять - делаем скрин области даты и номера документа и сравниваем с текущим номером и датой, если коэфицент совпадения больше определенного числа, то прерываем цикл.
21 pechkin
 
24.12.21
11:37
(20) тогда уж лучше opencv и поиск кнопки закрыть
22 Kassern
 
24.12.21
11:38
(21) пиксель по координатам быстрее находится, чем саму кнопку искать
23 PLUT
 
24.12.21
11:41
(21) обычный биоробот из бухгалтерии справится. зачем такие сложности?
24 Kassern
 
24.12.21
11:43
(23) тут написать то мин 15-20. А биороботу еще платить надо, да и подзабить на работу может
25 youalex
 
24.12.21
11:51
(16) не взлетает без соответствующего экспортного метода.
А если метод есть, то можно его напрямую дергать.
В качестве бреда - можно форму документа скопировать в обработку, а там в цикле менять объект (ЗначениеВРеквизитОбъекта) и ЗаписатьВФорме() )  Так и наглядно будет все
26 Kassern
 
24.12.21
11:52
(25) еще больше пятничных костылей в студию)
27 Ryzeman
 
24.12.21
11:53
(26) Програмно нажимать Tab и считывать активный элемент. Если он является кнопкой, прочитать его заголовок, если там "ок", то програмно послать Enter
28 Kassern
 
24.12.21
11:54
(27) это только для 1 документа, а нужно обойти динамический список и провести все там)
29 ptiz
 
24.12.21
13:13
(16) Ну да, там в итоге и вызывается методе формы: Форма.ЗаписатьВФорме()
30 ptiz
 
24.12.21
13:14
Но это только для толстого клиента
31 pechkin
 
24.12.21
13:26
(29) Но зачем, когда можно просто Записать()
32 ptiz
 
24.12.21
13:34
(31) ЗаписатьВФорме() вызывает срабатывание обработчиков формы ПередЗаписью, ПриЗаписи, ПослеЗаписи