работа с нетиповым оборудованием

  • Автор темы xopek160183
  • Дата начала
X

xopek160183

#1
Кто подскажет ответ или хотя бы направление подкопа на следующий вопрос!
Есть автомобильные весы с терминалом CAS.
Есть драйвер для 1С, который позволяет в 1С получать данные от весов.
При установке драйвера есть конфигурашка для теста оборудования, в которой есть новые обработки, через которые данные от весов можно получить в 1С.
Посоветуйте как прикрутить данный драйвер к типовой конфигурации, например торговля и склад 7. Причем должны обеспечиваться следующие функции. Взвешенный вес должен сохраняться и печататься в накладной ТОРГ-12 в разных форматах (т и кубах).

PS. Я не проф программист 1С, но с основами программирования pascal и delphi знаком.
Заранее спасибо! можно на xopek160183 собака mail.ru
 
H

Hryv

#2
Посмотрите код в тестовой конфе и по аналогии сделайте
Если код тестовой конфы небольшой, выложите здесь
или лучше .md в архиве
подскажем куда конкретно смотреть
 
X

xopek160183

#3
Вот целиком упакованный пример для 7. Но одно но - может не работать должным образом, так как для него еще и hasp есть. Но все же обработчики видны!
Заранее спасибо!
 

Вложения

  • 18.4 КБ Просмотры: 14
H

Hryv

#4
Я тестить не буду, просто код посмотрю
Сейчас некогда
Завтра отвечу

А может кто-нибудь и раньше ответит
 
T

TimeDontWait

#5
ТиС - типовая конфигурация Торговля и Склад, ну или береш любую другую...
1. Запускаеш 1с в режиме конфигуратора
2. Открываеш глобальный модуль этой конфигурации и глобальный модуль конфы ТиС(в которую хочеш внедрить данный драйвер);
3. копируеш сначала все переменные в начало глобального модуля ТиС;
4. ищешь в том же модуле процедуру: Процедура ПриНачалеРаботыСистемы();
5. копируеш весь код этой процедуры в глобальный модуль в тело такой же процедуры в ТиС;
6. копируеш процедуру в глобальный модуль но отдельно:
Код:
Процедура Выполнить() 
конт1.форма.обновить();
КонецПроцедуры
7. В данной конфе есть обработки, которые выгружаеш:
Действия -> ВнешнийОтчет(обработка) -> Сохранить как внешний отчет(обработку)
8. В конфе ТиС:
Действия -> ВнешнийОтчет(обработка) -> Вставить внешний отчет(обработку)
9. Добавляеш эти обработки в интерфейс как меню
 
X

xopek160183

#6
Спасибо, я попробую, посмотрю, что получится!
 
H

Hryv

#7
В принципе TimeDontWait все правильно написал
Могу добавить два небольших совета:

1. В глобальном модуле тестовой конфы есть
procedure ПриНачалеРаботыСистемы()
ее код действительно можно просто добавить в код Процедура ПриНачалеРаботыСистемы() в вашей конфе
но лучше перенести procedure ПриНачалеРаботыСистемы() именно как отдельную процедуру, переименовать например в ПодключениеВесов() и уже ее вызов подставить в ПриНачалеРаботыСистемы() в вашей конфе
Потом будет проще что-то подправить или просто вспомнить что к чему через год

2. Обработки можно не подключать как внешние, а просто копи/пастом прямо в дереве конфиругации скопировать/вставить

PS сделайте архив рабочей базы прежде чем ее править
 
X

xopek160183

#8
Спасибо! Добавить у меня получилось. Но я не стал переименовывать процедуру, а добавил код прямо в основную.
По поводу архивации базы вопроса нет, так как привинчивается к чистой, а потом уже будет заполняться. Комп настраивается в кабинете и подключить непосредственно к весам - это мягко сказать неудобно.
После запуска конфигурации появляется "ошибка подключения к OLE-серверу!".
И, прямо сказать, я в 1С не силен.
Не могли бы вы хотя бы в общих чертах описать - как сделать, чтобы данные о взвешивании сохранялись в базе вместе с остальными данными и затем печатались в накладной.
Я, например, подразумеваю, что например в форме "реализация" добавить кнопку, по которой будет выполняться считывание веса и данный вес будет присваиваться переменной "количество". :(
Будьте снисходительны!
Заранее благодарен!
 
H

Hryv

#9
После запуска конфигурации появляется "ошибка подключения к OLE-серверу!".
Уберите строки
ОткрытьФорму("Обработка.Новый1", конт1);
ОткрытьФорму("Обработка.Управление_модулями", конт2);
ОбработкаОжидания("Выполнить", 1);

Если не поможет, то пройдите в отладчике начиная с
Srv = CreateObject("TSHWMain.TSHWM");
и посмотрите с какой строки переходит на
Message("Ошибка подключения к OLE-серверу!");

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

Хорошо если в накладной уже есть поле (переменная) для веса, которая уже выводится на печать, только не заполняется

Тогда, как я понял, в форме (в диалоге) надо сделать кнопку, и на нее повесить процедурку с текстом

Если ScSrv.Stable = 0 Тогда
Иначе
ВЕС = ScSrv.Weight();
КонецЕсли;

где "ВЕС" - это ваша переменная

"ВЕС" будет меняться, если весы стабилизировались

можно в процедуру написать просто
ВЕС = ScSrv.Weight();

тогда "ВЕС" будет полюбому меняться

Если готовой переменной в вашей 1С нет, то все намного сложнее
Тогда вам придется читать матчасть

ЗЫ кстати обработки в вашей 1С вам в принципе не нужны
 
X

xopek160183

#10
Спасибо!
Эти обработки поставлялись как пример использования драйвера. Я понимаю, что можно попробовать просто включить в тело код процедуры получения веса и все (дрова то стоят).
А по поводу накладной! Я мельком просмотрел - при вводе данных "реализация" кроме контрагентов вводится соответственно товар и его количество. Я предполагаю попробовать использовать именно переменную количества не вводя новой. Просто при вводе количества данные предполагается вводить именно в автоматизированном режиме без возможности изменения их вручную. И все.
Буду пробовать. Что получится - расскажу!
Еще раз спасибо!
 
X

xopek160183

#11
По отладчику начал прогонять на строке
Srv = CreateObject("TSHMain.TSHWM") (в главном модуле. Строки добавлены из тестового обработчика)
вываливается на ошибку
"Класс не зарегистрирован, ClassID {F070B14F-CC1B-4F5DB339-70FF7D99410C}
далее переходит в конец процедуры, выдает "ошибка подключения к OLE-серверу" и переходит в "конецпроцедуры"
А при выполнении обработки, вставленной из тестовой конфы (строки с MSRWSrv. xxxxx) вываливаются ошибки типа
{Обработки.Новый.Форма.Модуль(хх):значение не представляет агрегатный объект (ххххх)}
На сколько я понимаю - это из-за ошибки подключения к OLE-серверу.
Система также не понимает, где взять значение ScSrv.weight.

Может я что не так делаю?
 

puh14

Well-known member
11.07.2008
1 412
0
#12
"Класс не зарегистрирован, ClassID {F070B14F-CC1B-4F5DB339-70FF7D99410C}
Длл-ка не зарегестрирована - какая - это вопрос. Попробуйте дллки что в каталоге базы зарегить через regsvr32 каталогБазы\бла-бла.dll

под вистой и 2008 проще написать батник и запустить его от имени администратора.
 
X

xopek160183

#13
Смысл в том, что тестовая конфа работает!
соответственно возникает вопрос - как можно определить, какой объект присабачен к этой тестовой конфе?
 

puh14

Well-known member
11.07.2008
1 412
0
#14
Проверь - у тебя на всех ЗагрузитьВнешнююКомпоненту() стоит проверка на =1, а то может он пытается её грузануть, проверки нет и всё фурычит дальше. А как определить какая тебе нужна - глянь в тестовой конфе строки ЗагрузитьВнешнююКомпоненту() - там должны быть все нестандартные Длл-ки.
 
X

xopek160183

#15
Спасибо за помощь! Все! Дайвер прикручен, данные в 1С приходят. Оказалось, что ко всему прочему еще и библиотеки драйвера криво стали. Децл повоевал и все пошло.
Теперь появился еще один вопрос. Правда он уже не совсем относится к данной теме.
При печати накладной необходимо не просто печатать взвешиваемый вес, а рассчитывать чистый вес груза с учетом веса пустого транспорта.
Я создал новый стравочник "Транспорт" с полями "Марка", "ГосНомер" и "Тара".
Заполнение поля "Тара" осуществляется только посредством кнопки "Взвешивание".
В глобальном модуле сделал процедурку:
Процедура УстТранспорт(Конт) Экспорт
СпрТранс = СоздатьОбъект ("Справочник.Транспорт");
СпрТранс.Выбрать("Выберите взвешиваемый транспорт","");
Если СпрТранс.Выбран()=1 Тогда
Конт.Транспорт = СпрТранс.ТекущийЭлемент();
КонецЕсли;
КонецПроцедуры

А в форме есть кнопка, которая вызывает данную процедуру.
Но не получается присвоить значение полю ввода.
Подскажите, что я не так делаю?
Мне надо, чтобы в поле выводились марка и номер транспорта, а при расчете значения веса груза использовалось значение поля "Тара" из справочника "Транспорт".

Добавлено: Как правильно организуется выбор значения из справочников?
(не судите строго, я ведь не проф)
 

puh14

Well-known member
11.07.2008
1 412
0
#16
Процедура УстТранспорт(Конт) Экспорт
СпрТранс = СоздатьОбъект ("Справочник.Транспорт");
Если СпрТранс.Выбрать("Выберите взвешиваемый транспорт","ФормаСписка")=1 Тогда
Конт.Транспорт = СпрТранс.ТекущийЭлемент();
КонецЕсли;
КонецПроцедуры

примерно так для РЕКВИЗИТОВ документа

а для элемента диалога который НЕ реквизит надо сделать

Функция УстТранспорт(Конт) Экспорт
СпрТранс = СоздатьОбъект ("Справочник.Транспорт");
Если СпрТранс.Выбрать("Выберите взвешиваемый транспорт","ФормаСписка")=1 Тогда
Возврат СпрТранс.ТекущийЭлемент();
КонецЕсли;
Возврат "";
КонецФункции


а на кнопке написать

моеполеввода = УстТранспорт(ТекущийЭлемент());
 

vbs

Well-known member
18.02.2007
1 708
1
#17
Тип реквизита "Транспорт" на форме именно "Справочник.Транспорт" ?
Тогда организуй заполнение поля примерно так : Поле = "Марка "+Транспорт.Марка+" № "+Транспорт.Номер (уточни имена реквизитов).
Для выбора из справочника можно использовать диалог ввода "ВвестиЗначение" или метод "ОткрытьПодбор" совместно с "ОбработкаПодбора"

2 Puh14
Передавая контекст формы в процедуру глобальника, можно управлять через этот контекст и реквизитами формы
 
X

xopek160183

#18
Я чего-то не догнал!!!Уже мозги закипают!
В форме Документ.Реализация есть Поле Ввода с идентификатором Транспорт. Тип этого поля - Справочник.Транспорт. На нее устанавливаю формулу: УстТранспорт(контекст)

В глобальном модуле сделал функцию:
УстТранспорт(конт) экспорт
СпрТранс=СоздатьОбъект("Справочник.Транспорт");
Если СпрТранс.Выбрать("Выберите вз........"."ФормаСписка")=1 Тогда
Возврат СпрТранс.ТекущийЭлемент();
КонецЕсли;
Возврат "";
КонецФункции

На данном поле ввода установил функцию Транспорт=УстТранспорт(ТекущийЭлемент())
Кстати, изначально при нажатии на кнопку вывода возможных значений (справа поля ввода) выводится
<>
<>
<>
Выбираю любую - появляется ошибка
Транспорт=УстТранспорт(ТекущийЭлемент<<?>>())
Функция не обнаружена (ТекущийЭлемент)

Что я делаю не так, никак не могу понять принцип работы и почему не срабатывает!
Все больше и больше начинаю запутываться, меня чего-то начинает клинить!
Я понимаю, что что-то не то, а догнать не могу!
 

puh14

Well-known member
11.07.2008
1 412
0
#19
Транспорт=УстТранспорт(ТекущийЭлемент<<?>>())
Функция не обнаружена (ТекущийЭлемент)
Я то думал ты из справочника процедуру вызываешь .. да и сам туплю - не нужен там контекст при таком написании нафиг

Функция УстТранспорт(конт) экспорт
СпрТранс=СоздатьОбъект("Справочник.Транспорт");
Если СпрТранс.Выбрать("Выберите вз........"."ФормаСписка")=1 Тогда
Возврат СпрТранс.ТекущийЭлемент();
КонецЕсли;
Возврат "";
КонецФункции
на кнопку - Транспорт=УстТранспорт(Контекст)

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

TimeDontWait

#20
А нельзя попроще, ВвестиЗначение и формулу в реквизит