В связи с отключением мисты(https://mista.ru),
Исходный код игры:
https://github.com/sikudaPy/seabattle
Сама игра на Amvera:
В связи с отключением мисты(https://mista.ru),
Исходный код игры:
https://github.com/sikudaPy/seabattle
Сама игра на Amvera:
«О, эфемерность! О, самое бессильное и позорное время в жизни моего народа – время от рассвета до открытия магазинов! Сколько лишних седин оно вплело во всех нас, в бездомных и тоскующих шатенов! Иди, Веничка, иди.»
Венедикт Ерофеев. Москва-Петушки.
Доброго времени суток!
Жила фирма 1С и у нее родилась прекрасная идея сделать формы и для десктопных приложений Windows и Linux и для современных браузеров. Так дела у нее шли очень хорошо и монопольненько, то задумываться о технических проблемах очень не хотелось. Идея была прекрасная и простая, понятная простому пользователю.
Но потихоньку кроме такой благостной идеи, захотелось реализовать из браузера простой доступ к файловой системе и при реализации его стали возникать проблемы.
И тут начинается наша сказка-быль…
Что-то ДиалогВыбораФайла не прикручивается к браузеру, и приходится использовать вместо него стремный ПоместитьФайл, но хуже того браузер вообще не дает доступ к файловой системе на компьютере по умолчанию.
Ничего сказали суперменыпрограммисты 1С и сделали РасширениеРаботысФайлами!
Долго ли коротко бродили богатыри в поисках лучшей доли правильного названия функций работы с файлами

Но как-то все не получался у них каменный цветок что-то понятное и простое.
Три дня и три ночи постоянно делали сложный код для БСП для автоустановки этого расширения ломая простой код для тонкого и ТОЛСТОГО клиента.
Но не сдохло чудище поганое но так и не сделали до конца работу записи локального файла на диск компьютера.
Не осилили богатыри ПолучитьИмяВременногоФайла() из Web-клиента, хвалясь молодецкой удальюгибкостью программы 1С…
Да и забросили разработку своего расширения с 2022 года.
По факту: Расширения доступа к файлам 1С в брузерах (выпуска 2022 года) не дает записать файл на локальном диске.
Было немного обсуждения добрых молодцев в mista.ru 2013 год: https://mista.ru/topic/679824
И обсуждение уже не молодцев в mista.ru в 2024 https://mista.ru/topic/896088
А вот ошибка осталась

Так и поросло мхом уже слово безопасность, но пытливые умы не забыли, что остальное осталось работать как и прежде
Бесконтрольное чтение файлов с локального диска, скачивание файлов с помощью curl (Выполнение произвольного кода) прекрасно работает в вэб-клиенте с расширением от 1С.
Наша стабильность у нас Руси и покойно в версиях 1С 8.3.27 и 8.5.1…
«О, эфемерность! О, тщета! О, гнуснейшее, позорнейшее время в жизни моего народа – время от закрытия магазинов до рассвета!..» «Ничего, ничего, Ерофеев..»
Венедикт Ерофеев. Москва-Петушки.
Доброго времени суток!
Оригинал статьи
PostgreSQL не запускается службаТензор-М Help.
Для начала нужно убедится что у папки PostgreSQL есть права необходимые для корректной работы базы данных. Если права папке выданы и служба все ещё не запускается то можно переходить к следующему шагу.
Следующий шаг это сбросить лог.
Для сброса лога:
1. Запустите командную строку (не от имени администратора).
2. Зайдите в папку «bin» (по умолчанию C:\Program Files (x86)\PostgreSQL\9.3\bin), найдите и перетащите pg_resetxlog.exe в командную строку, дописав в начале созданной строки «CD». Это нужно для того, чтобы перейти в нужную директорию. И нажмите ENTER.
3. Затем введите в команду pg_resetwal.exe -f «C:\Program Files (x86)\PostgreSQL\12.1\data» (где C:\Program Files\PostgreSQL\12.1\data — это путь по умолчанию).
4. После очистки лога запустите службу PostgreSQL. Если с первого раза служба не запустилась, то потребуется еще раз чистить и снова пробовать.
Если при первом вызове службы была ошибка:
pg_resetxlog: lock file «postmaster.pid» exists Is a server running? If not, delete the lock file and try again.
То удалите файл «postmaster.pid» (по умочанию C:\Program Files\PostgreSQL\9.3\data\postmaster.pid), чтобы сброс лога нормально отработал.
И немного лекций от 1С
Настройка и тонкости эксплуатации PostgreSQL для 1С

Обращение в службу поддержки 1С — Здравствуйте, а не подскажите где поставить флажок в 1С чтобы не переписывать функцию Вопрос на Ждать ВопросАсинх и убрать непонятную приставку Асинх из функций?
Ответ от телеграмм канала 1С: «А что непонятного то? Уж куда проще, чем ОписаниеОповещения»…
И всем доброго времени суток!
Так почему же простая функция Вопрос в 1С вдруг стала Ждать ВопросАсинх, а до этого вообще непонятная реализация через ОписаниеОповещения(callback)?
Давайте с самого начала сотворения мира с основы интерфейса оконных систем в компьютере. В классических много оконных системах (Windows как пример) всегда любая программа основное свое время находится в не рабочем состоянии, ожидая действий пользователя. А для обработки событий от пользователя нужна функция обработки их.
Старая добрая Windows функция обработчик (Пример кода)
|
1 |
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
А как дело здесь обстоит с обработкой событий в модальных диалоговых окнах (чувствуете связь с терминологией 1С). Ключевым фактором здесь будет то, что при открытии окна диалога у нас возникает своя отдельная функция обработка события. И мы полностью переключаемся с одной функции обработки событий на другую. Когда выбор в диалоге сделан, обработчик событий переключается назад на основную функцию обработчика. Зачем нам все это знать? Посмотрим пример кода: (Пример кода)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
int msgboxID = MessageBox( NULL, L"temp.txt already exists.\nDo you want to replace it?", L"Confirm Save As", MB_ICONEXCLAMATION | MB_YESNO ); if (msgboxID == IDYES) { // TODO: add code } |
Как все аналогично как с 1С программированием? Модальный вызов функции MessageBox в терминах 1С? Практически один в один код для 1С
|
1 2 3 4 |
Ответ = Вопрос("Выполнить полную синхронизацию?", РежимДиалогаВопрос.ДаНет); Если Ответ = КодВозвратаДиалога.Да Тогда // TODO: добавить код здесь КонецЕсли; |
Именно поэтому в терминологии 1С возникают такие понятия как модальные окна, которые скорее переходят в модальные вызовы и далее в не рекомендованные модальные вызовы. Это путь которым шла 1С.
Если мы посмотрим на современный браузер, то там модальных диалоговых окон (модальных вызовов) просто нет. Запрет на использование дополнительных окон. Тенденция изолирования вкладок. Это обосновано с точки зрения безопасности. Но реализовать визуально «модальный» диалог мы можем через функцию обработчик событий. Делаем затемненным затемненным всю остальную часть и специально выводим область для окна диалога в центр (Нажми — реализация диалога через callback)

Для каждой кнопки как и всегда описываем свой обработчик событий. Можно сделать общий обработчик для всех кнопок диалога. Вот 1С и предложила нам такой же подход когда ввела специальный объект ОписанияОповещения. Отдельно описываем функцию куда вернется результат выбора (Документаия от 1С). По сути создаем callback и делаем его обработчиком. Как же это совместимо с предыдущим подходом? Никак. Куча возмущений от 1С-ников и инфоповод разобраться.
Количество таких ОписанияОповещения (callback) обработчиков возрастает в приложении неимоверно, что ужасно влияет на читаемость и отладку кода. Это навызается callbackhell или АдОписалокОповещений.
Так как же нам просто сделать единый код без создания обработчиков событий для «модальных диалоговых окон»?
И тут явно 1С решило использовать новую конструкцию в браузерах :
|
1 2 3 4 5 |
async function Questions() { let result = await fun_async(); //И "Получаем ответ в: "+ result1; } |
И мы видим аналогичный код в 1С.
|
1 2 3 4 5 6 7 8 9 |
&НаКлиенте Асинх Процедура ВыполнитьАлгоритм(Команда) Результат = Ждать ВопросАсинх("Выполнить быстро или не медленно?", РежимДиалогаВопрос.ДаНет); Если Результат = КодВозвратаДиалога.Да Тогда // Первый вариант алгоритма Иначе // Второй вариант алгоритма КонецЕсли; КонецПроцедуры |
То есть 1С не изобрела ничего нового, но решила использоваться новыми стандартными языка javascript — promise. Шаг в правильную сторону, но в плане реализации задания интерактивного взаимодействия с пользователем по сути является некоторой надстройкой на надстройкой. Желание некоторых переписать весь код под новую конструкцию с полной точки зрения не является удовлетворительным.
Р.S. Для особо любознательных: Пример реализации для браузера
И для тех кто любит много слов — https://курсы-по-1с.рф/news/async-metods-article/
Ну пример в bootstrap как это сделать изменением стилей (где здесь асинхронность?): Пример диалоговых окон от bootstrap 5
Доброго времени суток!
Итак возвращаемся к обсуждению скорости работы современных приложений и еще почему уточняем почему переход на виртуальные машины неизбежен.
В предыдущее обсуждение https://blog.sikuda.ru/?p=3188
Мы получили что скорость выполнение кода jvm, .net принципиальна выше скриптовых языков. Это и понятно. Но остался вопрос, почему скорость работы на jvm иногда падает в 10 раз, а иногда нет. И с какими настройками или механизмами это связано?
Углубляемся в документацию:
Виртуальные машины Java/Android выделяют объекты очень быстро. Сборка мусора также идет весьма быстро. Однако при выделении большого количества объектов за короткий промежуток времени можно столкнуться с проблемой под названием «перемешивание памяти» (memory churn). В таком случае виртуальная машина не будет успевать выделять объекты в таком темпе, а сборщик мусора – их утилизировать, и приложение начнет притормаживать, а в экстремальных случаях даже израсходует всю память.
И если мы попробуем выполнить java/kotlin алгоритм на телефоне:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import java.util.ArrayList; import java.time.LocalDateTime; import java.time.ZoneOffset; //Ускоритель java "-XX:+UseParallelGC7 public class test { public static void main(String[] args) { int n = 50000000; ArrayList<Boolean> array = new ArrayList<Boolean>(); array.add(false); array.add(false); int i = 2; while( i <= n ){ array.add(true); i += 1; } System.out.print("Start-"); LocalDateTime timeBegin = LocalDateTime.now(); i = 2; while ( i <= n ) { if( array.get(i) ){ long sq = (long)i * i; if (sq <= n) { int m = (int)sq; while (m <= n) { array.set(m, false); m += i; } } } i += 1; } LocalDateTime timeEnd = LocalDateTime.now(); long diff = timeEnd.toEpochSecond(ZoneOffset.UTC) - timeBegin.toEpochSecond(ZoneOffset.UTC); System.out.print("End-"); System.out.print(diff); } } |
Получаем на телефоне время выполнения 1-4 сек. Но мы совершенно безобразно используем память, выделяем огромный кусище и никак его не используем в дальнейшем и поэтому неудивительно, что иногда это приводит к нехватке памяти. Мы в телефоне с ограниченными ресурсами для всех, а не на десктопе. Мы конечно в манифесте поставим параметр — android:largeHeap="true", это спасает на старых телефонах. Но сам факт выполнения на телефоне с ART быстрее , чем на десктопе с oscript, php, python и 1C говорит о многом.
Р.S. Исходник программы на Котлин(Android) — Эратосфен мобайл
Настало время позаниматься мобильными приложениям в 1С. Начнет с простейшего — определение координат для приложения из модуля ‘СредстваГеопозиционирования’.
Всякий нормальный человек, когда хочет определить где он находится. Посмотрим по сторонам. Смотрит на некоторые таблички на домах. Посмотрит в свой мобильный. То первое есть совершит первое — некоторое длительные действия. Второе попытается определить свое местонахождение по нескольким источникам. И если второе вполне разумно, то длительный процесс с длительным зависание основного потока делают большинство начинающих программистов.
В 1С это ‘ОбновитьМестоположение’ при длительном определении — крутим колёсико — подвешиваем интерфейс ввода. Висим мы время зависимое от параметра этой функции. Если не определили за это время не беда возвратим неопределённое. Ну не могло ещё устройство определить координаты. Получается для надёжности многие делают это несколько раз из разных источников — в общем ждать приходится ещё больше.
ITS — https://its.1c.ru/db/v836doc#bookmark:dev:TI000000910
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Попытка ДМ = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение("gps"); Исключение ДМ = Неопределено; КонецПопытки; Если ДМ = Неопределено Или ТекущаяДата()-МестноеВремя(ДМ.Дата) > 300 Тогда СредстваГеопозиционирования.ОбновитьМестоположение("gps", 10); ДМ = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение("gps"); КонецЕсли; Если ДМ = Неопределено Тогда ТекущийПровайдер = "network"; Попытка ДМ = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение("network"); Исключение ДМ = Неопределено; КонецПопытки; КонецЕсли; Если ТекущаяДата() - МестноеВремя(ДМ.Дата) > 5*60 Тогда СредстваГеопозиционирования.ОбновитьМестоположение("network", 10); ДМ = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение("network"); КонецЕсли; Если ДМ = Неопределено Тогда Возврат Неопределено; КонецЕсли; |
То есть 1С висит, но разве проблема в системе?
А может надо просто посмотреть как работает сама мобильная система? В чем основа мобильных систем и чем они отличаются от десктопных.
Мы можем запустить определение координат асинхронно и не ограничивая жестко времени но сильно заранее. Перед основным действием при котором нам точно надо будет определить координаты. Например вы делаете фотографию и Вам нужны координаты места фотографии. Запускаем процесс определения гео-координат при начале съёмки.
Значит нам надо к моменту получения координат делать предварительные правильные действия, а потом правильные действия чтобы прекратить бурное потребление энергии. Записываем данные координаты например в реквизиты формы и можем продолжать обновлять координаты для более точной геолокации. Когда по бизнес логике надо закрывать форму и записывать данные, записываем вместе и координаты. И самое главное отключаем асинхронно определение координат, энергия на мобильном устройстве должна жёстко экономиться.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
&НаКлиенте //Инициализация Процедура Сфотографировать(ПрямаяПередачаФото = Истина) #Если МобильноеПриложениеКлиент ИЛИ МобильныйКлиент Тогда Если НЕ СредстваГеопозиционирования.ИспользованиеДанныхГеопозиционированияВключено() Тогда Сообщить("Включите геолокацию. Координаты не определяются!"); Иначе Если ЭтоОпределениеКоординат = 0 Тогда //Включаем один раз геолокацию ЭтоОпределениеКоординат = 1; //включение определения координат Оповещение1 = Новый ОписаниеОповещения("ОповещениеМестоположенияGPS", ЭтотОбъект); СредстваГеопозиционирования.ПодключитьОбработчикИзмененияМестоположения(Оповещение1,"gps"); Оповещение2 = Новый ОписаниеОповещения("ОповещениеОбработчиковNetwork", ЭтотОбъект); СредстваГеопозиционирования.ПодключитьОбработчикИзмененияМестоположения(Оповещение2,"network"); КонецЕсли; КонецЕсли; #КонецЕсли //Получение &НаКлиенте Процедура ОповещениеМестоположенияGPS(ИмяПровайдера, Местоположение, ДопПараметр) Экспорт //Записываем один раз координаты GPS если они другие от net Если Местоположение <> Неопределено Тогда Если Объект.Широта <> Местоположение.Координаты.Широта ИЛИ Объект.Долгота <> Местоположение.Координаты.Долгота Тогда Объект.Широта = Местоположение.Координаты.Широта; Объект.Долгота = Местоположение.Координаты.Долгота; КонецЕсли; КонецПроцедуры КонецПроцедуры //Закрытие Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) Если НЕ Отказ Тогда Оповещение1 = Новый ОписаниеОповещения("ОповещениеМестоположенияGPS", ЭтотОбъект); СредстваГеопозиционирования.ОтключитьОбработчикИзмененияМестоположения(Оповещение1,"gps"); Оповещение2 = Новый ОписаниеОповещения("ОповещениеОбработчиковNetwork", ЭтотОбъект); СредстваГеопозиционирования.ОтключитьОбработчикИзмененияМестоположения(Оповещение2,"network"); //Есть координаты для записи в базу Если Объект.Широта <> 0 И Объект.Долгота <> 0 Тогда ЗаписатьКоординатыФотографий(); КонецЕсли; КонецПроцедуры |
Список сссылок:
https://its.1c.ru/db/v836doc#bookmark:dev:TI000000910
https://infostart.ru/public/256078/
https://habr.com/ru/post/210162/
Р.S. И под конец лошка дегтя в наш мед. Если мы берем телефон с Android Go то вышеприведенный код может вызывать вылет приложения 1С. Вы такого быть не может? Это просто у Вас мало опыта работы с разными SDK и под разным железом. И обязательно тестируйте приложение на тех телефонах на которых оно должно работать.
В общем пожелаю Вам спокойных ночей!
Доброго времени суток!
Импортозамещение будем делать на примере 1С Мобильное приложение.
Купили тут дешевые телефоны HONOR 9S без Google-сервисов. Хотели использовать для 1С мобильного приложения. Казалось ничто не предвещало проблем. Но проблемы с определением местонахождения обнаружились сразу и очень жестко. В других моделях телефонов проблем не было. Сначала думали, можно будет немного подправить и все заработает.
Разбираем код 1С:
|
1 2 3 4 5 6 |
//получаем данные об использовании геопозиционировании СредстваГеопозиционирования.ИспользованиеДанныхГеопозиционированияВключено() = Ложь //список активных провайдеров СредстваГеопозиционирования.ПолучитьПровайдеров(Истина) = Неопределено //Список всех провайдоров СредстваГеопозиционирования.ПолучитьПровайдеров(Ложь) = Неопределено |
2021 год:
Долго копались, но ответ оказался неожиданным. Необходимо установить Google-сервисов или воспользоваться приложением типа GSpace. Запустить 1С внутри GSpace.
Спасибо https://forum.infostart.ru/forum92/topic261437/#message2645088
Вот такие сложное взаимозависимости оказалось. США накладывает санкции на китайские корпорации, а не работает русская 1С.
2024 год:
Кто-то невнимательный может cказать, что уже все заработало. Да на телефонах Huawei без Google-сервисов позиционирование стало работать. Но почему она стало работать?
https://dl03.1c.ru/content/Platform/8_3_24_1020/1cv8upd_8_3_24_1020.htm
В мобильной версии системы «1С:Предприятие» реализована поддержка Huawei Mobile Services (HMS). (8.3.24)
То есть русская 1С зависит от американских и китайских сервисов. Вам Вам реальный взаимосвязанный мир!
Доброго времени суток!
2021 год.
Ну не мог я пройти мимо тестирования 1С executer и oscript — https://youtu.be/A1CedCgm1eA
Из документации 1С:
Язык «1С:Исполнителя» строго типизирован. У каждой переменной, параметра и метода, возвращающих значения, должны быть заданы типы или перечисление возможных типов через вертикальную черту «|» – нельзя передать переменную непредусмотренного типа.
И что мы имеем в Исполнителе с Массивом?
Новый Массив()
А в java на технологиях которого работает он:
ArrayList<Boolean>
Время работы исполнителя 216 сек, время oscript 97 сек, а jvm меньше 1 сек.
Для сравнения приведем что там реально на Диком Западе в динамической типизации?
Python3 27 сек
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import datetime n = 50000000; array = [] array.insert(0, 0) array.insert(1, 0) i = 2 while i <= n: array.insert(i, 1) i += 1 print("Begin-"); timeBegin = datetime.datetime.now() i = 2; while i <= n: if array[i] == 1: sq = i * i; if sq <= n: m = sq while m <= n: array[m] = 0 m += i i += 1 timeEnd = datetime.datetime.now(); diff = (timeEnd - timeBegin).seconds; print("End-") print(diff) |
PHP7 19 сек
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php //$n = 50000000 ini_set("memory_limit", -1); $n = 50000000; $array = array(); $array[0] = 0; $array[1] = 0; for($i = 2; $i <= $n; $i++){ $array[$i] = 1; } print("Begin-"); $timeBegin = new DateTime('now'); $i = 2; while ( $i <= $n ) { if( $array[$i] === 1) { $sq = $i * $i; if($sq <= $n) { $m = $sq; while ($m <= $n) { $array[$m] = 0; $m += $i; } } } $i += 1; } $timeEnd = new DateTime('now'); $diff = $timeEnd->getTimestamp() - $timeBegin->getTimestamp(); print("End-".$diff) ?> |
И вне конкурса — статическая типизация
JAVA меньше секунды
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import java.util.ArrayList; import java.time.LocalDateTime; import java.time.ZoneOffset; public class Main { public static void main(String[] args) { int n = 50000000; ArrayList<Boolean> array = new ArrayList<Boolean>(); array.add(false); array.add(false); long i = 2; while( i <= n ){ array.add(true); i += 1; } System.out.print("Start-"); LocalDateTime timeBegin = LocalDateTime.now(); i = 2; while ( i <= n ) { if( array.get((int)i) ){ long sq = i * i; if (sq <= n) { int m = (int)sq; while (m <= n) { array.set(m, false); m += i; } } } i += 1; } LocalDateTime timeEnd = LocalDateTime.now(); long diff = timeEnd.toEpochSecond(ZoneOffset.UTC) - timeBegin.toEpochSecond(ZoneOffset.UTC); System.out.print("End-"); System.out.print(diff); } } |
P.S. Комментарий от создателя Перфоленты
я уже понял, что достаточно флага «-XX:+UseParallelGC» что бы Джава быстро работала… в моём последнем тесте Джава, Шарп и Перфолента показали почти одинаковые результаты… +/- пару процентов…
То есть оптимизация сборщика мусора в задаче безумного использования огромного массива все расставляет на свои места.
2024 год. Ситуация меняется
1С 8.3.12 — 382 сек.
1С 8.3.22 — 518 сек
1С 8.3.25 — 523 сек
1С Executer 2020.2.5-23 U(JVM 17) — 50 сек
OneScript — 50 сек
1С Executer 5.2 U(JVM 17) — 28 сек
Обсуждаем — https://mista.ru/topic/895098
Доброго времени суток!
Если вы используете JSON внутри 1C и очень любите из него грузить данные могу Вас порадовать — это делается очень быстро и сразу получаются объекты 1С
СерилиазоторXDTO.ЗаписьJSON(ЗаписьJSON);
Но могу Васи сильно огорчить, если вы попытаетесь загрузить то что нет в вашей конфигурации, скажем нет у нас справочника СекретныйСправочник
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "#type": "jv8:Structure", "#value": [ { "name": { "#type": "jxs:string", "#value": "АдресРазгрузки" }, "Value": { "#type": "jcfg:CatalogRef.СекретныйСправочник", "#value": "ebe410a9-0b75-11e9-80c0-ac162da64212" } } ] } |
Вы не просто получите ошибку и сможете ее перехватить для обработки. Вы получите стоп игра.

И прямой вылет программы 😉
Доброго времени суток!
Если Вы в 1С любили использовать дополнительный реквизиты и свойства, мучились с их настройками то использование дополнительных полей в Битрикс Вам понравиться.
Итак преступим.
Для того, чтобы получить в выборе значения дополнительных полей их надо указать UF_INN в параметре SELECT
|
1 2 3 4 5 6 7 8 9 10 |
$arParams["SELECT"] = array("UF_INN"); $dbUsers = CUser::getList($by = 'LAST_NAME', $order = 'ASC', , $arParams); while ($currUser = $dbUsers->Fetch()) { echo '<pre>'; //print_r($currUser); //print_r($currUser["ID"]."-".$currUser["LAST_NAME"]."-".$currUser["NAME"]."-".$currUser["PERSONAL_BIRTHDAY"]."-".$currUser["XML_ID"]."+".$currUser["UF_INN"]); print_r($currUser["UF_INN"]); echo '</pre>'; } |
Источники:
https://dev.1c-bitrix.ru/support/forum/forum6/topic36976/
https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=3496&LESSON_PATH=3913.4776.4804.3496