вторник, 30 декабря 2014 г.

Что делать если некорректно работает метод ПроверитьВывод

Всем привет. Сегодня я столкнулся с достаточно недокументированой особеностью платформы. А именно при формировании печатной формы некооректно отрабатывал метод ПроверитьВывод. Суть проблеммы заключалась в том что табличный документ не влезал на страницу, и последние две строчки печатались на отдельном листе. Решив, что я что-то напутал в коде я все проверил, естественно ни чего особенного в нем не нашел. Поскольку проблемма была не решена, а решить ее требовалось, я готов был прикрутить костыль, а именно перед началом вывода документа увеличить поля табличного документа, а после вывести документы с нормальными полями, к сожалению,а может быть и к счастью(так как в дальнейшем, была найдена и устранена данная ошибка), эту проблему таким способом решить не удалось. Документ по прежнему печатался как и раньше, т.е вылезал за область документа.
Еще раз изучив код вывода документа, Я обратил внимание на строчку:

ТабДокумент.ИмяПараметровПечати = "ИмяПечатнойФормы";

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

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





понедельник, 25 августа 2014 г.

Отсутствует отображение для типа '{http://v8.1c.ru/8.1/data/core}ValueTable'



Добрый день. Сегодня наступил на интересные грабли:

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: param Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа '{http://v8.1c.ru/8.1/data/core}ValueTable'


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

воскресенье, 17 августа 2014 г.

Установка 1С на ubuntu 10.04

Увеличиваем максимальный размер сегмента памяти до 1Гб. Для менее мощных машин устанавливают от 64Мб до половины объема ОЗУ (для теста выделим 1Gb):
# echo "kernel.shmmax=1073741824" >>/etc/sysctl.conf
# sysctl -p 

Генерируем русскую локаль и задаем переменную среды LANG, именно с ней будет работать скрипт инициализации базы данных.
# locale-gen en_US ru_RU ru_RU.UTF-8
# export LANG="ru_RU.UTF-8"

Устанавливаем необходимые зависимости:
# apt-get install imagemagick

Ставим все необходимые пакеты (1c берем с их офф.сайта):
dpkg -i 1c-enterprise83-common_8.3.4-476_amd64.deb
dpkg -i 1c-enterprise83-server_8.3.4-476_amd64.deb      
dpkg -i 1c-enterprise83-ws_8.3.4-476_amd64.deb
dpkg -i 1c-enterprise83-common-nls_8.3.4-476_amd64.deb 
dpkg -i 1c-enterprise83-server-nls_8.3.4-476_amd64.deb  
dpkg -i 1c-enterprise83-ws-nls_8.3.4-476_amd64.deb 


Заходим в консоль из windows и создаем новую базу


Устанавливаем apache
apt-get install apache2


Добавляем в httpd.conf необходимые данные о базе данных, с помощью скрипта webinst, входящего в состав пакета 1С сервера. Для этого переходим в каталог:

Консоль:
cd /opt/1C/v8.3/i386

Запускаем скрипт с необходимыми параметрами:

Консоль:
./webinst -apache22 -wsdir base -dir '/var/www/base' -connStr 'Srvr="1cserver";Ref="base";' -confPath /etc/apache2/httpd.conf


Где base - имя БД к которой настраиваем доступ, 1cserver - имя сервера на котором установлен 1С сервер.

Устанавливаем необходимые пакеты для работы(шрифты):

apt-get install ttf-mscorefonts-installer

воскресенье, 10 августа 2014 г.

Удаление 1С на сервере linux(Ubuntu)

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

dpkg -l | grep 1c-enterprise

Соответственно для удаление пакета необходимо воспользоваться командой :

dpkg -r  <имя пакета>

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

Если вы хотите удалить сервер 1С вместе с конфигурационными файлами, Вам необходимо будет воспользоваться командой(пример для 8.3)

dpkg --purge 1c-enterprise83-server

вторник, 15 июля 2014 г.

Ошибка загрузки библиотеки libWand.so по причине:Библиотека не обнаружена.

Сегодня, после переустановки платформы   8.3.4.468 на сервере ubuntu с 64 на 32 битную. при запуске бухгалтерии в толстом клиенте получил ошибку:

Ошибка загрузки библиотеки libWand.so по причине:Библиотека не обнаружена. 
Часть функций будет недоступна. 
Обратитесь к разделу справочной системы «1С:Предприятие - Работа пользователя – 
Особенности работы в Linux – Внешние библиотеки» 


Оказалось, что для 32 битной платформы, библиотеки нужны тоже 32 битные(что вроде бы логично, но было упущено из виду)

Решение: установить 32 битный пакет imagemagick командой:
apt-get install imagemagick:i386

воскресенье, 20 апреля 2014 г.

Ошибка: При подписке на событие

Сегодня после обновления УТ 11 у меня выскочила вот такая ошибка:

При подписке ОбменДаннымиПриСозданииПланаОбмена на событие ОбработкаПолученияФормы произошла ошибка. Обработчик события не найден.

Вопрос решился очисткой кеша приложения(можно просто удалить базу из списка и создать заново).. Видимо вопрос очистки кэша на платформе 8.3.4.465 до сих пор не решен.

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

пятница, 3 января 2014 г.

Веб сервисы на PHP+nuSOAP и подключение из 1С

Это небольшая история о том как я используя библиотеку nuSOAP на PHP запустил веб сервис и подключился к нему из 1С.

Во первых почему nuSOAP - наверное потому что это простота использования, Вам достаточно скачать исходники, положить в Ваш проект и на этом подключение модулей заканчивается.
И начинаются другие трудности о которых я хочу поведать читателю.
Первое с чем я столкнулся, это то что в примерах выложенных на просторах интернета, есть ошибки, по крайней мере у меня по методике копипаста сразу не заработали, а точнее(как я выяснил позже) не заработал клиент на PHP а вот сервер оказался вполне рабочим, и так, вот самый простой работающий пример, который выглядит так:

<?php
// Подключаем код NuSOAP
require_once('lib\nusoap.php');
// Создаем экземпляр сервера
$server = new soap_server();
// Инициализируем поддержку WSDL
$server->configureWSDL('hellowsdl', 'urn:hellowsdl');
// Устанавливаем пространство имен с префиксом tns для WSDL-схемы
$server->wsdl->schemaTargetNamespace = 'urn:hellowsdl';
$server->soap_defencoding = 'utf-8';
// Регистрируем предоставляемый метод
$server->register('hello',                // название метода
    array('name' => 'xsd:string'),        // входные параметры
    array('return' => 'xsd:string'),      // выходные параметры
    'urn:hellowsdl',                      // пространство имен
    'urn:hellowsdl#hello',                // soapaction
    'rpc',                                // стиль
    'encoded',                            // использование
    'Says hello to the caller'            // описание
);

// Определяем метод как функцию PHP
function hello($name) {

      return $name;
}

// Используем HTTP-запрос чтобы вызвать сервис
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>

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

Более того там был не рабочий код клиента, который должен был обратиться к данному веб сервису и получить с него данные. Но поскольку моя задача состояла подключиться к нему из 1С, то проще оказалось проверить работоспособность веб сервера именно из 1С код подключения к веб сервису получился такой:

Определение = Новый WSОпределения("http://localhost/helloworld.php?wsdl");
Прокси = Новый WSПрокси(Определение, "urn:hellowsdl", "hellowsdl", "hellowsdlPort");
Результат = Прокси.hello(Реквизит1);
Сообщить(Результат);

Все работало, но как показали тесты данный пример на отрез отказывался работать с русской кодировкой. Не буду мучать читателя о всех способах, которые мне пришлось попробовать, чтобы заставить корректно работать с кирилицей данный веб сервис, но решение так-же было найдено на просторах интернета, правда не с первого раза, поэтому и решил написать, что-бы было больше информации на данную тему. Итак суть решения в том что nuSOUP пытается автоматически привести переданные значения  в кодировку utf-8, а поскольку 1с отправляет данные уже в кодировке utf-8  то в итоге нам конвертируют значения несколько раз, и что-бы решить данную проблему, модуль nuSOUP необходимо отучить от автоматической конвертации. Для этого открываем файл nusoup.php и ищем строки:

var $decode_utf8 = true;
Меняем на 
var $decode_utf8 = false;
далее ищем:
function nusoap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){
и меняем на 
function nusoap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=false){
после этого мой сервис заработал корректно. Однако на сайте где было найдено данное решение были и другие советы, я их тоже оставлю на данной странице, дабы они не потерялись:

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

Также можно заменить все упоминания ISO-8859-1 на UTF-8 или cp1251

Если дело уж совсем плохо, то можно конвертировать в формат &#1053;&#1072; &#1075; 
Ну и в конце концов можно попробовать использовать другой NuSoap

Если случится чуди и всё заработает как надо 
Замените 
$GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = 9;
на 
$GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = 0;