Комментарии 93
//1С при передаче по ссылке свойства ВК Список.Current
// при выходе из метода присваивает Список.Current значение переданное изначально
// Поэтому помечаем входной параметр как Знач
//Или же делать так, если методы изменить нельзя
// То нужно присвоить значение переменной и вызвать метод передав в параметрах эту переменную
//Стр=Список.Current;
//Зазача=ъ(Стр);
Функция Ъ(знач Ссылка)
// Создаем объект по ссылке полученной из методов .Net классов
//Физически это строка ёЁ<Ьъ>№_%)Э?&2 содержащее 12 символов для отделения их от других строк
//и индекс в спике исполуемых объектов на стороне .Net
рез = Новый("AddIn.NetObjectToNative.NetObjectToNative");
// И установим ссылку
рез.УстановитьСсылку(Ссылка);
возврат рез
КонецФункции// СоздатьОбъектПоСсылке()
Так при передаче объекта в параметрах приходится получать строковую ссылку
СборкаSqlClient=ъ(Врап.Сборка("System.Data.SqlClient.dll"));
SqlConnection=ъ(СборкаSqlClient.GetType("System.Data.SqlClient.SqlConnection"));
SqlCommand=ъ(СборкаSqlClient.GetType("System.Data.SqlClient.SqlCommand"));
connection =ъ(Врап.Новый(SqlConnection.ПолучитьСсылку(),ConnectionString));
connection.Open();
ТекстЗапроса = "Select Номенклатура.DESCR Наименование From sc84 Номенклатура where DESCR Like '%'+@Строка+'%'
|order by Номенклатура.DESCR";
command = ъ(Врап.Новый(SqlCommand.ПолучитьСсылку(),ТекстЗапроса,connection.ПолучитьСсылку()));
Parameters=ъ(command.Parameters);
Parameters.AddWithValue("@Строка", "ДСП");
dr = ъ(command.ExecuteReader());
Пока dr.Read() Цикл
Сообщить(dr.get_Item("Наименование"));
КонецЦикла;
Да это не суть. В Native API есть структура
struct _tVariant
{
_ANONYMOUS_UNION union
{
.......
IID IDVal;
struct _tVariant *pvarVal;
struct tm tmVal;
_ANONYMOUS_STRUCT struct
{
void* pInterfaceVal;
IID InterfaceID;
}
__VARIANT_NAME_2/*iface*/;
_ANONYMOUS_STRUCT struct
{
char* pstrVal;
uint32_t strLen; //count of bytes
}
__VARIANT_NAME_3/*str*/;
_ANONYMOUS_STRUCT struct
{
WCHAR_T* pwstrVal;
uint32_t wstrLen; //count of symbol
/ } __VARIANT_NAME_4/*wstr*/;
} __VARIANT_NAME_1;
uint32_t cbElements; //Dimension for an one-dimensional array in pvarVal
TYPEVAR vt;
};
В которой можно использовать
void* pInterfaceVal;
IID InterfaceID;
А в vt; указать, что это ВК.
Раньше при передаче двоичных данных между 1С: Предприятием и внешней компонентой существовал ряд ограничений. Например, передать двоичные данные во внешнюю компоненту было нельзя, а при работе в веб-клиенте обмен двоичными данными был вообще невозможен.
Теперь мы убираем все эти ограничения. Обмен двоичными данными вы можете осуществлять в обе стороны и даже в веб-клиенте.
На работе существующих внешних компонент это никак не отразится. Они будут работать, как и раньше. А вот во вновь создаваемых компонентах вы сможете теперь в качестве параметров передавать объекты ДвоичныеДанные
https://wonderland.v8.1c.ru/blog/rasshirenie-funktsionalnosti-raboty-s-dvoichnymi-dannymi/
http://rsdn.org/forum/dotnet/6538046.1
.NET Core Roadmap
Там хорошая технология SignalR
1C Messenger для отправки сообщений, файлов и обмена данными между пользователями 1С, вэб страницы, мобильными приложениями а ля Skype, WhatsApp
.NET Core Roadmap
Уже сейчас много кроссплатформенного под .Net Core
Например RSS Каналы
А вот клиент для .Net Core RabbitMQ .NET client — CoreCLR VERSION https://www.rabbitmq.com/
Сейчас проверил такой код
var compilation = Microsoft.CodeAnalysis.CSharp.CSharpCompilation.Create("a")
.WithOptions(new Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary))
.AddReferences(
Microsoft.CodeAnalysis.MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location))
.AddSyntaxTrees(Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree.ParseText(
@"
using System;
public class C
{
public C(){}
public string M()
{
return ""Hello Roslyn."";
}
}"));
var fileName = @"d:\NetStandart\TestCoreNetApp\src\TestCoreNetApp\bin\Debug\netcoreapp1.0\a.dll";
compilation.Emit(fileName);
var a = System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromAssemblyPath(fileName);
Type тип = a.GetType("C");
var obj = Activator.CreateInstance(тип);
var res = тип.GetMethod("M").Invoke(obj, null);
Console.WriteLine(res.ToString());
Текущая необходимость использовать сторонние HTTP сервере (Apache, IIS) для публикации HTTP сервисов мне не нравится. Есть очень простые задачи по интеграции при реализации которых уходит на порядок больше времени для настройки окружения, чем на саму реализацию. Да и с точки зрения секьюрости открывать дефолтно настроенный ( а большинстве случаев так и есть, настраивается по мануалам без особого понимания) HTTP сервер — опасно.
Нет 1С никогда на это не пойдёт…
Основной закон развития капитализма (эволюции), это увеличение специализации.
Ну и по моей практике как раз наоборот сисадмины почему-то (может в силу лени) часто не могут настроить IIS приходится самому делать. А мне за это не платят :(
Сколько же можно уже игнорировать просьбы разработчиков?
Сделайте уже нормальный OpenConf/Снегопат.
В новую среду разработки заложена потенциальная возможность расширения. Используя прикладной интерфейс и технологию подключаемых модулей (плагинов) мы планируем предоставить вам возможность расширять имеющиеся инструменты разработки.
Это, правда, не конфигуратор, но его замена в будущем.
Но на деле при выборке документов (например счёта на оплату) повсюду вижу ссылки на другие сущности типа: 35d1f6e5-289b-11e6-8ba4-e03f49b16074. Приходится делать много дополнительных REST запросов, чтобы собрать полную информацию о документе. Возможно, есть какая-то опция «загрузить все связанные объекты по ссылкам на глубину N»?
А вообще, REST уже не модно, даёшь в следующей версии 1С встроенный GraphQL!
явно вы интегрируете данные в свою систему, где также хотите реализовать бизнес-логику. То есть «сделать странное»...Так и есть! Вся бизнес логика и управленческий учёт на стороне «своей системы», а из 1С (Бухгалтерии) делаем печать документов и различную регламентированную отчётность, которая часто меняется и которую нет смысла программировать самостоятельно.
Странно это или нет? Да, можно было бы программировать бизнес логику непосредственно внутри 1С (платформа гибкая, мощная), но мы решили «снаружи». 1С у нас выступает как «микросервис» для бухгалтерской отчётности. Вполне рабочий вариант, я вам скажу! И по технологиям более привлекательный, т.к. мы не ограничены одним языком программирования или платформой.
$expand
Данный параметр позволяет вместе с результатами основного запроса получать значения связанных сущностей, что позволит не запрашивать каждую сущность отдельно.
Linq To ODATA
Да есть возможность в ODATA сразу подгружать нужные свойства
var result = (from Тестовый in context.Catalog_Тестовый.Expand("РеквизитСправочник")
where Тестовый.Ref_Key == new Guid("aada18ad-5308-11e5-8e05-c86000c70663")
select Тестовый).SingleOrDefault();
Но пока в 1С Параметр $expand не поддерживается"
И хотя написано в заголовках написана одна версия odata, ответы присылает по другой.
У кого нибудь получилось состыковаться и изменить данные в 1с
Там суть в другом. Когда выставляешь context.Format.UseJson(); то идут заголовки и 1С возвращает данные в формате JSON.
Столкнулись с тем, что когда кидаешь в 1С запрос в формате json с заголовками «хочу-json» получаешь ответ в xml. Добавив url $format=application/json получили наконец json.
На этом этапе мы смогли получать данные от туда норм.
Дальше встал вопрос сохранения в json. Тут сколько не бились, ничего не получилось. Потом я заметил расхождения в версиях Odata смотря на документацию на сайте odata и мы отложили это дело.
интеграция с web языками, с линуксаВ metadata.js есть двунаправленная шина данных — хоть в браузере, хоть под nodejs. К ней можно подключить 1С-ные и не 1С-ные базы разной структуры. Вместе с библиотекой интеграции, получается почти честная CRDT для 1С.
Так сложилось, что последние лет 6 я занимаюсь сопровождением 1С под Linux (в качестве скорее сисадмина, чем разработчика), и постоянно сталкиваюсь с проблемами, что в стандартных конфигурациях вроде всё замечательно работает, но вдруг вылезает захардкоженное обращение к сущностям, отсутствующим у моих подопечных как класс — то штрихкод формируется прямым обращением к .dll (уже нет), то для формирования файлов отчётности в xml (!) требуется наличие Internet Explorer (по крайней мере было справедливо для УПП годичной давности), то путь к [файловому] хранилищу обязательно должен оканчиваться символом "\" (а у меня все пути оканчиваются "/")… вот теперь ещё и про «ODBC-совместимые базы данных» напомнили… с публикацией на web-сервере из Linux — вообще отдельная боль.
Хотелось бы узнать — есть ли, и если есть, то насколько приоритетна задача создания платформы полностью работоспособной без Windows?
> Внешние источники данных – это прикладной объект конфигурации 1С, позволяющий взаимодействовать с любой ODBC-совместимой базой данных как на чтение, так и на запись.
ODBC-драйвера есть и под Linux. Соответственно, внешние источники данных работают и под Linux.
Хотелось бы узнать — есть ли, и если есть, то насколько приоритетна задача создания платформы полностью работоспособной без Windows?
Задача в общем-то решена 1С. Есть много внедрений 1C на Linux. В нашем облачном сервере 1cfresh.com десятки серверов на Linux.
Если в каких-то конфигурациях что-то не работает на Linux — чиним.
Задача в общем-то решена 1С. Есть много внедрений 1C на Linux. В нашем облачном сервере 1cfresh.com десятки серверов на Linux.
Если в каких-то конфигурациях что-то не работает на Linux — чиним.
Не совсем так. У меня тоже есть несколько внедрений 1С на Linux, и тоже вполне работоспособных, по крайней мере, если используются последние типовые конфигурации. По моим наблюдениям, главные недоработки в этом направлении на сегодня:
- Нет GUI-аналога оснастки "Администрирование серверов 1С Предприятия" — мне пришлось костылить собственный web-интерфейс для дёрганья командной строки на 1С-сервере.
- УПП содержит много элементов, жёстко ссылающихся на Windows-сущности. Я понимаю, что конфигурация устаревшая, что надо бы на ERP мигрировать, но вот миграция эта, в отличии от Бухгалтерии 2.0->3.0 или "Кадров" оценена только по лицензии в весьма ощутимую сумму денег, а не стоит забывать, что ещё и настройки все надо с нуля переписывать, что очень сильно демотивирует потребителя от такого решения (по сути — новое внедрение). Вот и приходится "грызть кактус", вынимая из сейфа ноутбук с Windows Home, когда приходит пора сдавать отчётность. Благо ещё не пришлось интегрировать в эту конфигурацию складское или производственное оборудование — обошлись обменами с внешними источниками.
1С Linux. Что не хватает по сравнению с Windows? InfoStart
1С Linux. Что не хватает по сравнению с Windows? Mista.ru
Но так и не получил внятного ответа. Меня прежде всего интересует что мне добавить, что бы моя разработка заинтересовала людей.
Чего не хватает в Linux по сравнению с Windows
главные недоработки в этом направлении на сегодня
У них есть недоработки, но вовсе не те, о которых вы написали.
1) Это не unix-way! Только командная строка, только хардкор! И не просите больше такую ересь :)
2) С 2006 года я стал участвовать в проектах на УПП на платформе Предприятие 8.0 и четко помню, что в то время, когда создавались нелюбимые вами связанные с Windows механизмы, никакого Linux-сервера даже в планах не было, не говоря уже про нативные клиенты, а следовательно не было необходимости что-либо делать кроссплатформенным. Рабочий (а не wine-симуляция) клиент появился относительно недавно, но слишком поздно. Не помню где точно я это прочитал (в инфописьме или в какой-то статье) и не могу привести ссылочку, но компания 1С после релиза рабочей версии ERP отказались от дальнейшего развития функциональности в УПП, только поддержка существующих наработок. Следовательно никакого глобального рефакторинга не будет.
Про неупомянутые мной недоработки можно почитать в официальных списках — их там сотни, но о них уже сказано и обещано поправить, а вот по поводу:
- Ну не могу я дежурному специалисту техподдержки группы производственных предприятий давать рутовый (даже судоэрский) доступ к командной строке продакшн-сервера. Да и "не по Ваньке шапка" — тут нужен какой-то доступный и удобный механизм, позволяющий завершить зависшие сеансы (сеансы-зомби, которые проявляют фоновую активность, но клиентский интерфейс уже отвалился от графической оболочки) или выявить источник повышенной нагрузки на сервер. Пока для себя решил эту задачу как раз написанием собственного web-интерфейса, дёргающего команды на сервере, но это как-то по-колхозному смотрится.
- То, что УПП "похоронили" стало известно примерно через 6 месяцев после начала моего самого крупного внедрения и примерно через месяц после начала его ввода в эксплуатацию. Платформа 8.3 на тот момент обладала отвратительной стабильностью, а ERP была доступна только "для ознакомления", хотя на неё пообещали скидку при условии подписания контракта на внедрение с публичной оглаской. Да, понимаю, что стоило бы на раннем этапе "броситься в омут", но слишком уж высоки были риски и бизнес не согласился.
Повторюсь — "… нужен какой-то доступный и удобный механизм..." — дежурный специалист (круглосуточный) имеет наименьший необходимый набор навыков для устранения текущих сбоев — если этих навыков не хватает, то он фиксирует внештатную ситуацию и дёргает следующий уровень, что стоит дополнительных денег и нервов. Способный продраться сквозь последовательность команд, позволяющих увидеть картину на сервере/кластере специалист будет стоить значительно дороже, чем специалист, способный в графическом интерфейсе посмотреть на основные показатели, сравнить их с "эталонными" и предпринять соответствующие действия для разрешения проблемы. Почему для Windows такой инструмент есть "из коробки" (к нему, правда, тоже есть немало претензий), а для Linux — нет?
Прям возникает желание привести мою вэб-морду к более-менее унифицированному виду и опубликовать для общественности...
Как альтернативу, можно сделать сценарий, который проверит состояние кластера и даст пользователю варианты исправления ошибок. Это даже еще быстрее и удобнее чем в gui-интерфейсе кликать мышкой между базами различных серверов в поиске зависших сеансов.
Для денежных средств есть экспорт-импорт из КБ — работает нормально.
Плоды массового обновления на праздниках коту под хвост. Придется везде откатываться.
Теперь ODATA не работает на Linux серверах, сразу и не заметил, пока пользователи не пришли и не стали жаловаться, что CRM не работает. По HTTP даже не запрашивает пароль и вылетает с ошибкой 408/409
1C:Enterprise 8 application error:
Error executing query
by reason:
server_addr=tcp://1c:11560 descr=recv returns zero, disconnected line=1570 file=./src/DataExchangeTcpClientImpl.cpp
Я так понял для типовых базовых конфигураций odata не работает.
Какой тип конфигурации и лицензии нужно покупать, чтобы odata работал?
как включить ODATA для всех документов и справочников?
Я нашел в документации:
Механизм установки состава объектов, доступных с помощью стандартного интерфейса OData, можно выполнить в виде внешней обработки. Для этого не требуется модифицировать прикладное решение.
Как запустить внешнюю обработку?
вот обработка внешняя. Возможно, для вашей конфигурации надо будет чуток подшаманить в конфигураторе.
Спасибо! Помогло!
Нужно было создать функцию "СведенияОВнешнейОбработке", как написано по ссылке:
http://1c-pro.ru/threads/stati-po-razrabotke-k-rassmotreniju.47563/
и интерфейс OData заработал!
В типовой конфигурации базовой лицензии есть ограничение на одновременную работу в один пользователь.
т.е. 1С OData считает за пользователя.
Даже если обращения к OData не идут, то предприятие не запускается, говорит есть подключения.
Если перезагрузить IIS, то он пустит. Но кто будет каждый раз перезапускать IIS?
Я так понимаю, где-то должен быть параметр в IIS или в 1С, который отвечает за таймаут, чтобы по истечении этого времени IIS отпустил базу.
Кто нибудь сталкивался с этим?
Нашел параметр при публикации веб клиента "Время жизни соединения", поставил 120сек. Но он видимо не влияет. После того как закрывается http соединение к odata, через 60сек становится возможным редактировать данные в 1С. Главное, чтобы все http соединения были закрыты.
Я проверял в браузере хром и через wget. 60с таймаут и там и там.
Вобщем odata работает :)
на https://partners.v8.1c.ru доступ никто не дает.
Вот такой вот замкнутый круг.
![](https://habrastorage.org/files/f12/88f/22a/f1288f22a8024885a53f8060afa1f8f9.png)
Пишу партнерам по франшизе, а они отвечают, что они могут только сообщать об ошибках в конфигурациях.
Вот это похоже на отмазку франча :) Если я правильно понял фразу «партнерам по франшизе».
Добрый день!
Мы оказываем консультационные услуги только по использованию типовых решений для Казахстана и отраслевых решений компании «1С-Рейтинг».
Вопросы по использованию возможностей платформы «1С: Предприятие» при доработке/разработке конфигураций Вы можете задавать на специализированном форуме участников-партнеров https://partners.v8.1c.ru/.
В частности, по Вашему вопросу есть похожие сообщения https://partners.v8.1c.ru/forum/topic/1560477#m_1560477, https://partners.v8.1c.ru/forum/message/1561229#m_1561229, в которых данная ситуация признана ошибкой платформы.
Почему с помощью расширения? — Не хочется снимать с поддержки конфигурацию.
Задача информировать внешние интеграционные системы об изменениях в базе, нежели регулярно опрашивать.
Архитектурно правильнее не вызывать веб-сервис (да и вообще внешние ресурсы) из обработчиков, т.к. время их отклика труднопредсказуемо и может существенно замедлить работу системы. Правильнее будет оформить вызовы веб-сервиса в фоновом задании, а из обработчика инициализировать их выполнение.
Вызов веб сервера осуществляется локально, то есть в одной подсети виртуальных машин на гипервизоре.
Сам веб сервер только лишь принимает данные и транслирует их в сокет и отвечает кодом 200. То есть по сути является прокси.
А сокеты уже сами куда надо отправляют и обрабатывают данные. Так что не вижу смысла формировать фоновые задания.
Единственное, в расширениях нельзя иметь константы, обработчики и чего-то еще… не помню… пришлось снимать с поддержки.
можно ли использовать внешние RESTful сервисы и обращаться к ним из 1С?
Да, начиная с версии платформы 1С: Предприятие 8.3.6.
Есть ли способы интеграции с RESTful старым клиентам, на 8.2, предыдущих 8.3 платформах?
Насколько знаю — можно, через объект HTTPСоединение. Объект HTTPСоединение появился в платформе достаточно давно, чуть ли не с 8.3.1. В общем — если в коде доступен объект HTTPСоединение, то, скорее всего, интеграция возможна (если вызываемый сервис не использует какие-то экзотические атрибуты).
Автоматическое REST API и http-сервисы, создаваемые разработчиком появились в 8.3.5
А HTTPСоединение было давным давно, но большинство возможность были добавлены в 8.2.18
про стандартный обмен 1С можно подробнее тут найти
Способы интеграции с 1С