koreav

53
Рейтинг

koreav



  •   Регистрация: 26.04.2007 (17 лет назад)

  •   Был(а) на сайте: 12.04.2024

Подписчики 3

Группы

Профессиональный разработчик

Премиум-аккаунт 2017 (Автоматизатор) (до 23.03.2025 10:06:25)

Карта покупателя GOLD

Рейтинг 53

Подсистема хранения файлов

Инструменты и обработки Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free) Архив с данными Адаптация типовых решений

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

23.03.2010    9862    774    koreav    32       

53

Комментарии

DevУниверсальные инструменты 1С#59 30.01.20 17:30
ИР, конечно, наше всё, спасибо автору!, раз он тут
Но УИ , это то что нужно для нашей новой ERP),
однозначно+++
БУСканирование, хранение и печать сертификатов продукции [Обновлено 17.01.2011]#73 21.01.20 13:02
Автор, спасибо, добавлю свои 5 копеек,
пример с поточным сканирование

Код
      масРез = Новый Массив;
      
      ScanDialog = Новый COMОбъект("WIA.CommonDialog");
      
      Device = Неопределено;
      DevMan = Новый COMОбъект("WIA.DeviceManager");
      
      НастройкиСканирования = EK_ПолучитьНастройкиСканирования();
      ИмяСохраненногоСканера = НастройкиСканирования.EK_Сканирование_ИмяСканера;
      
      Если ЗначениеЗаполнено(ИмяСохраненногоСканера) Тогда
         Для Ит = 1 по DevMan.DeviceInfos.Count Цикл
            Если DevMan.DeviceInfos(Ит).Properties("Name").Value = ИмяСохраненногоСканера Тогда
               Device = DevMan.DeviceInfos(Ит).Connect();
               Прервать;
            КонецЕсли;
         КонецЦикла;
      КонецЕсли;
      
      Если Device = Неопределено Тогда
         Device = ScanDialog.ShowSelectDevice();
      КонецЕсли;
   
      Если Device = Неопределено Тогда
         Возврат масРез;
      КонецЕсли;
      
      Items1 = ScanDialog.ShowSelectItems(Device);
      Если Items1 = Неопределено Тогда
         Возврат масРез;
      КонецЕсли;
      
      ПотоковоеСканирование = Ложь;
      Если Device.Properties.Exists("3088") Тогда //"Document Handling Select"
         Для Ит = 1 по Device.Properties.Count Цикл
            Если Device.Properties(Ит).PropertyID = 3088
               И Device.Properties(Ит).Value = 1 Тогда // выбран автоподатчик
               
               ПотоковоеСканирование = Истина;
               
            КонецЕсли;
         КонецЦикла;
      КонецЕсли;
      
      Images = Новый Массив;
      Для каждого itm из Items1 Цикл
         
         Если ПотоковоеСканирование Тогда
            
            
            Для Ит = 0 по 25 Цикл
               
               //img2 = Device.GetItem(itm.ItemID);
               
               Попытка
                  Image = ScanDialog.ShowTransfer(itm);
                  Images.add(Image);
               Исключение
                  Прервать;
               КонецПопытки;
            КонецЦикла;
            
         Иначе
            
            Image = ScanDialog.ShowTransfer(itm);
            Images.add(Image);
            
         КонецЕсли;
         
      КонецЦикла;
      
      
      IP = Новый COMОбъект("WIA.ImageProcess");
      IP.Filters.Add(IP.FilterInfos("Convert").FilterID);
      IP1 = IP.Filters(1);
      Для К = 1 По IP1.Properties.Count Цикл
         Если IP1.Properties(К).Name = "FormatID" Тогда
            IP1.Properties(К).Value = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"; //PNG
            Прервать;
         КонецЕсли;
      КонецЦикла;
      
      Для каждого Image из Images Цикл 
         Image = IP.Apply(Image);
         
         ИмяФайла = ПолучитьИмяВременногоФайла("jpg");
         Image.SaveFile(ИмяФайла); //сохраним на жесткий диск объект WIA
         
         масРез.Добавить(ИмяФайла);
      КонецЦикла;
      
      Возврат масРез;

DevNative ВК для 1CV8: независимое чтение файлов *.xls и *.xlsx#153 25.04.14 15:01
Спасибо, нужная обработка.

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

Хотя если получать значение через OLE (например, ExcelPage.Cells(3,5).Value), то все ок, и нули на месте.
Можно это починить?


+пара багов
1) если получать значение таким образом: xls.ЗначениеЯчейки(1,2,ТекКолонка.Значение),
где, ТекКолонка тип КлючИЗначение, и ТекКолонка.Значение = 3 (Число)
то вываливается ошибка {(1)}: Поле объекта недоступно для записи (Значение)

2) если попытаться прочитать пустую ячейку (т.е. номер строки(наверное и колонки) которой > чем есть в файле), то возвращается значение последней успешно считанной ячейки, вместо пустого или вызова исключения

Прикрепленные файлы:

2014-04-25 12-58-47 Microsoft Excel - dpd.xlsx.png
DevКак в soap сообщении явно указать каждому типу пространство имен#5 25.04.14 14:27
решена DPD ), вот кусок из их гайда, вдруг кому пригодится
Код
Функция ПолучитьТекстЗапросПоЗаказамORDERNUM(Заказы, Заказчик, Ключ)
   ЗаписьXML = Новый ЗаписьXML;
   ЗаписьXML.УстановитьСтроку();
   //ЗаписьXML.ЗаписатьОбъявлениеXML();
   ЗаписьXML.ЗаписатьНачалоЭлемента("soap:Envelope");
   ЗаписьXML.ЗаписатьАтрибут("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/");
   ЗаписьXML.ЗаписатьАтрибут("xmlns:ns0", "http://dpd.ru/ws/order2/2012-04-04");
   ЗаписьXML.ЗаписатьНачалоЭлемента("soap:Header");
   ЗаписьXML.ЗаписатьКонецЭлемента();
   ЗаписьXML.ЗаписатьНачалоЭлемента("soap:Body");
   ЗаписьXML.ЗаписатьНачалоЭлемента("ns0:getOrderStatus");
   ЗаписьXML.ЗаписатьАтрибут("xmlns:xs", "http://www.w3.org/2001/XMLSchema");
   ЗаписьXML.ЗаписатьАтрибут("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
   ЗаписьXML.ЗаписатьНачалоЭлемента("orderStatus");
   ЗаписьXML.ЗаписатьНачалоЭлемента("auth");
   ЗаписьXML.ЗаписатьНачалоЭлемента("clientNumber");
   ЗаписьXML.ЗаписатьТекст(Заказчик);
   ЗаписьXML.ЗаписатьКонецЭлемента();
   ЗаписьXML.ЗаписатьНачалоЭлемента("clientKey");
   ЗаписьXML.ЗаписатьТекст(Ключ);
   ЗаписьXML.ЗаписатьКонецЭлемента();
   ЗаписьXML.ЗаписатьКонецЭлемента();
   Для Каждого Заказ Из Заказы Цикл
      ЗаписьXML.ЗаписатьНачалоЭлемента("order");
      ЗаписьXML.ЗаписатьНачалоЭлемента("orderNumberInternal");
      ЗаписьXML.ЗаписатьТекст(Заказ);
      ЗаписьXML.ЗаписатьКонецЭлемента();
      ЗаписьXML.ЗаписатьКонецЭлемента();
   КонецЦикла;
   ЗаписьXML.ЗаписатьКонецЭлемента();
   ЗаписьXML.ЗаписатьКонецЭлемента();
   ЗаписьXML.ЗаписатьКонецЭлемента();
   ЗаписьXML.ЗаписатьКонецЭлемента();
   ТекстXML = ЗаписьXML.Закрыть();
   Возврат ТекстXML;
КонецФункции
Функция ОтправитьЗапросWEBСервису(URL,ТекстXML,Таймаут = 10000)
   Если ПустаяСтрока(ТекстXML) Тогда
      Возврат "";
   КонецЕсли;
   WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
   WinHttp.SetTimeouts(Таймаут, Таймаут, Таймаут, Таймаут);
   WinHttp.Option(2,"utf-8");
   WinHttp.Open("POST",URL);
   WinHttp.setRequestHeader("Content-Type","text/xml; charset=utf-8");
   Сообщить("Начало - " + ТекущаяДата());
   Сообщить("URL: " + URL);
   //Сообщить("ТекстXML запроса: " + ТекстXML);
   Попытка
      WinHttp.Send(ТекстXML);
      Сообщить("Завершение - " + ТекущаяДата());
      Если WinHttp.Status = 200 Тогда
         Сообщить("Ответ: " + WinHttp.ResponseText);
         Возврат(WinHttp.ResponseText);
      Иначе
         Сообщить("Ошибка сервера: " + WinHttp.Status + " " + WinHttp.ResponseText + " " + WinHttp.StatusText, СтатусСообщения.Важное);
         Возврат("");
      КонецЕсли;
   Исключение
      Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
      Возврат("");
   КонецПопытки;
КонецФункции
DevКак в soap сообщении явно указать каждому типу пространство имен#1 23.07.12 13:08
Обращаюсь к сторонней web-службе:
Определение = Новый WSОпределения("http://appl.dpd.ru:8080/services/geography?wsdl");

Прокси = Новый WSПрокси(Определение, "http://dpd.ru/ws/geography/2012-04-17", "DPDGeographyService", "DPDGeographyPort");

Фабрика = Прокси.ФабрикаXDTO;

Параметры = Фабрика.Создать(Фабрика.Тип("http://dpd.ru/ws/geography/2012-04-17","getTerminalsSelfDelivery"));

Параметры.auth = Фабрика.Создать(Фабрика.Тип("http://dpd.ru/ws/geography/2012-04-17","auth"));

Параметры.auth.clientKey = getClientKey();
Параметры.auth.clientNumber = getClientNumber();

Перехватываю soap сообщение сгенеренное 1С:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

<soap:Header/>
<soap:Body> <getTerminalsSelfDelivery xmlns="http://dpd.ru/ws/geography/2012-04-17"

xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<auth>
<clientNumber>xxx</clientNumber>
<clientKey>xxx</clientKey>
</auth>
</getTerminalsSelfDelivery></soap:Body>
</soap:Envelope>

Результат:
Ошибка SOAP сервера: com.sun.istack.XMLStreamException2: org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'auth'. One of '{auth}' is expected.

Если добавляю руками (руками в soapui) пространство имен
т.е. вместо
<getTerminalsSelfDelivery xmlns="http://dpd.ru/ws/geography/2012-04-17"

пишу
<nsogogo:getTerminalsSelfDelivery xmlns:nsogogo="http://dpd.ru/ws/geography/2012-04-17"


то все ок.

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

*пожалуйста перенесите тему в нужный раздел
ПубликацииУниверсальный журнал документов для 1С 8.1, 8.2 и 8.3 (3.20.1.8)#138 18.11.10 18:52
(137) Моя логика:
-если у пользователей нет полных прав - значит есть специально обученные люди, которые и будут шерстить форум;
-если у пользователей есть полные права, скорее всего, нет штатных специалистов, тогда сами пользователи и будут лазить по инфостартам.

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

Нужен корпоративный режим.

Можно к примеру сделать такую проверку:
если обработка внешняя или есть все флажки из (136) тогда
показывать меню публикации
проверять обновления
и пр.
конец если




ПубликацииУниверсальный журнал документов для 1С 8.1, 8.2 и 8.3 (3.20.1.8)#136 17.11.10 12:45
Предложение: сделать видимым меню "Публикации" только для тех у кого есть все права на корень конфигурации (Администрирование, Обновление конф. БД и пр.), т.к. пользователям глубоко все равно до инфостарта и прочих технических подробностей :)
DevКоллекция красивых девушек!#4 02.09.10 21:00
"+" за оригинальность :) хоть что-то новое
DevПодсистема хранения файлов#29 18.08.10 13:06
все стандартно:
Авторы запрещают использование алгоритмов и методик опубликованных в данной обработке, без указания на данную разработку и авторов. И любое коммерческое использование без согласования с разработчиками.
AdminВнешняя история изменений (журнал изменений) и * версий всех ссылочных объектов, констант и регистров сведений для 8.1, 8.2-8.3 (обычное и управляемое приложение) (вер. 5.1)#24 23.07.10 12:46
кстати, во внешней базе у роли "Администратор" нет прав на чтение констант

Ошибка при выполнении обработчика - '{ОбщийМодуль.ИсторияОбъектовОбщий(163)}: Ошибка при вызове метода контекста (ПроверитьВозможностьЗаписи): Произошла исключительная ситуация: {ОбщийМодуль.Общий(3)}: Ошибка при вызове метода контекста (Получить): Нарушение прав доступа!'
по причине:
{ОбщийМодуль.ИсторияОбъектовОбщий(163)}: Ошибка при вызове метода контекста (ПроверитьВозможностьЗаписи): Произошла исключительная ситуация: {ОбщийМодуль.Общий(3)}: Ошибка при вызове метода контекста (Получить): Нарушение прав доступа!

по причине:
Произошла исключительная ситуация: {ОбщийМодуль.Общий(3)}: Ошибка при вызове метода контекста (Получить): Нарушение прав доступа!