8.х Помогите пожалуйста новичку (представление числа)

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем CSCO12103692, 19 июн 2012.

  1. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Добрый день.
    Есть два вопроса

    Первое
    Подскажите пожалуйста, может ли 1Ска писать в файл какое-то число именно числом а не отдельными символами?

    Например число: 4607085440071
    Мне нужно чтобы после его записи в файл при просмотре, скажем, FARом оно выдавало: 430ABB0EC47

    А 1С пишет такое: 34 A0 36 30 37 A0 30 38 35 A0 ......... и все в таком духе.

    Извините, я не программист (не только 1С, но и вообще нигде не программировал), незнаю как правильно сформулировать. Может есть специальные термины для описания числа посимвольно либо целиком?

    зы
    Пишу в файл через

    запись = новый записьтекста(ИмяФайла,"ISO-8859-1");

    запись.ЗаписатьСтроку(число);

    Где переменная число берется из строки ввода.


    Второе.

    Есть опять какое-то число. Пусть даже тоже самое
    decimal: 4607085440071
    hex: 04 30 AB B0 EC 47
    В hex виде нужно переставить у него байты местами. В 1Ске я уже этот вопрос решил, но порывшись в интернете, увидел что вроде бы в С++ есть спец команды для извращений с числами, и теперь меня теперь мучают сомнения, что может и в 1С есть что-то подобное?

    Посторюсь, я не программер, так что извиняйте за корявое описание проблем.
  2. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Забыл уточнить:
    1с - 8.2.15.301

    И во втором вопросе под "переставить у него байты местами" мне требуется прочитать наоборот.
    Т.е.
    04 30 AB B0 EC 47 представить как 47 EC B0 AB 30 04 (Что поделаешь, железка только так понимает :((() Ну и сами часла бывают разной величины от 2х до 6ти байт.
    Опять повторюсь: этот вопрос решен, просто хотелось узнать может можно было малой кровью обойтись, а не городить там отдельную процедуру.
  3. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Задача не совсем понятна.
    Взяли вы штрихкод. Посчитали, что это число. Теперь как число выразили его в hex (430ABB0EC47), а дальше? То что выводит в шестнадцатеричном режиме 34 A0 36 30 37 A0 30 38 35 A0 - понятно, оно вам по байтам выводит код каждого символа. Как вы хотите полученное значение в файл записать? Если запишите как текст, оно вам опять таки выведет 34 33 30 41 42 42 30 45 43 34 37. Если же как двоичные данные, что-то не доходит как оно должно это число на байты разбить: 43 0A BB 0E C4 7?



    [off]
    Хм.. Странные вопросы у вас для не программиста.
    [/off]
  4. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    "43 0A BB 0E C4 7"
    нет нет, там "04 30 AB B0 EC 47", то есть если даже в калькулятор виндовский ввести 4607085440071 то оно его, при переключении в hex, так и представит. В том и вопрос, можно ли его так-же записать самой 1Ской? Вот прямо взять это число и так шестью байтами в файл записать. То не посимвольно как она пытается...\

    И в догонку, если так сделать нельзя. Как мне тогда сконвертировать в такой формат? То есть, из длинной побайтовой последовательности генерируемой 1с сделать коротельнькое число? Поскольку хочется самому что-то шурупить, то лучше код не пишите, а скажите пожалуйста где покопать :)

    Хм.. Странные вопросы у вас для не программиста.
    Я просто ИТшник типа. Не программер, сетями занимался.
  5. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Думаю можно. Правда чет навскидку встроенного вроде ничего такого и нет для перевода из одной системы счисления в другую. Придется все писать.
    Как-то так будет:
    Берем изначальное число, переводим в hex, разбиваем получившуюся строку hex по байтам, для каждого байта: переводим каждый байт в dec, функцией Символ() получаем соответствующий символ, этот символ текстом и записываем.
  6. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Понятно, я подобным занимался, когда байты в числах наоборот читал :)
    Железо по другому не понимает.. Эх, в общем понятно. Легких путей нет.
  7. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Еще один простой момент..... я просто не понимаю описание.

    Я могу передать массив за пределы процедуры?? А то у меня сейчас получается, что придется из массива собирать число, его передавать куда нужно, а затем опять раскладывать на составные... или я чего-то не понимаю :)

    У меня все в виде внешней обработки.

    Числа (ну или там строки) как передавать допер - в начале вне процедур определить через
    перем ххх;

    А массив ??? как ни пробую - ругается. :(((
  8. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Вопрос не понятен.

    Можно использовать не процедуру а функцию, возвращаемым значением которой и будет массив. Да и в любом случае по-умолчанию в 1С параметры в процедуры передаются по-ссылке, так-что любое изменение параметра и так будет видно после выполнения процедуры.
  9. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    "Чтобы правильно задать вопрос, нужно знать большую часть ответа" Я похоже не накопил еще этой критической массы.

    Про нечто под названием функция не знал, попробую в хелпе, да на просторах нета посмотреть, спасибо. Еще немного подумав понял, что значение массива можно никуда не передавать, а сразу писать в файл. Т.е. утилизировать на месте :)

    В общем буду ковыряться дальше. ^^

    зы
    Я купил версию для обучения программированию 8.2, брался за нее, но там не совсем то что нужно :(((
    Там делают конфигурацию с нуля, а у меня стоит задача создать внешнюю обработку с кучей функций.
  10. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Почему не то что нужно? Так вам ведь надо изучить синтаксис и возможности языка 1С. А что после этого писать конфигурацию или внешнюю обработку - это дело второе. Другое дело что вам сейчас (в вашей текущей задаче) насколько я понимаю, не нужно знание обЪектов метаданных конфигурации, а просто нужны примитивные функции языка имеющиеся в 1С.
  11. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Да там как-то все графика да графика, а во внешних обработках язык да язык сплошной. Вот и показалось, что лучше попробовать несредственно делом позаниматься, толку будет больше.

    Ребят, тут еще один вопрос возник.
    Есть некий массив (все пока тестовое, учусь) значения которго я дважды подряд пишу в файл. Известно, что он на 4 байта, и все его значения(начиная с нулевого индекса: 10 0 0 1, на первый проход и 20 0 0 1 на второй)
    Пытаюсь писать в файл.

    голова = новый массив();

    сообщить (голова[0]);
    сообщить (голова[1]);
    сообщить (голова[2]);
    сообщить (голова[3]);
    запись.записать (символ(голова[0]));
    запись.записать (символ(голова[1]));
    запись.записать (символ(голова[2]));
    запись.записать (символ(голова[3]));

    То есть перед записью я еще проверяю на всякий значения в массиве. Он говорит, мол, все ок, прекрасная маркиза, значения 10 0 0 1 20 0 0 1
    открываю созданный файл в hex и вижу чудо;

    0D 0A 00 00 01 14 00 00 01

    То есть первая 10 заменена на 0D 0A, а дальше все OK. Вот что это за 0d 0a и как с ним бороться? Из интернета понял, что это какие-то служеюные символы, но какого черта 1С сама их пихает куда не требуется??? Уже хочется ругаться(((

    Сегодня уже пол дня пытаюсь логику для записи тестового файла памяти записать с нулевым результатом в частности из за этой фигни :(((
  12. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    0D 0A - это стандартный символ перевода строки (точнее символ перевода строки + возврат каретки). Почему у вас их пишет, тем более в начало - затрудняюсь сказать, они добавляются в конец строки при вызове метода ЗаписатьСтроку(), у вас же насколько вижу метод Записать().

    З.Ы.
    Странный вы язык программирования выбрали для работы с файлами на низком уровне. 1С не заточена под это.
  13. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Это все часть большого проекта. Далее потребуется и работать с базами данных (загрузка и выгрузка) разных конфигураций, писать на ftp, в com порт ( вот тут еще хз, я пока не нашел готового примера основанного только на 1с), и еще там сям по мелочи.

    Но поскольку я новичок в программировании, то занимаюсь пока примитивными вещами.

    Не можете предложить как отдебагить сей процесс? Я о 0D 0A. Это может быть баг платформы?
    Я уже затрудняюсь сказать как еще можно упростить код, чтобы набрать статистику. Проще вроде бы уже некуда.

    Самое главное, что перед записью я все значения прошу вывести, то есть проверяю. И все OK. Как так???

    Завтра с утра буду еще пытаться взбивать под собой масло :)
  14. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Апдейт.
    Похоже 1с не любит символ(10)
    У нее просто крыша едет от него.... и не понятно как это обойти. Ведь 10ка вполне может потребоваться для запись....

    Любопытную задачку подкинули разработчики.
  15. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Еще апдейт.


    запись = новый записьтекста(ИмяФайла,"ISO-8859-1");

    для а = 0 по 255 цикл
    запись.записать (символ(а));
    конеццикла;

    создает файл с 257 символами. На месте 10 стоит 0D 0A, то есть этот 0D и есть 257, в гробу мною виденный.
  16. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Код:
    Функция ASCII2UNOCODE(КодASCII)
    Если ((КодASCII > 191) И (КодASCII < 256)) Тогда
    Возврат (КодASCII + 848);
    ИначеЕсли КодASCII = 185 Тогда
    Возврат 8470;
    ИначеЕсли КодASCII = 184 Тогда
    Возврат 1105;
    ИначеЕсли КодASCII = 168 Тогда
    Возврат 1025;
    Иначе
    Возврат КодASCII;
    КонецЕсли;
    КонецФункции
    
    
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    ИмяФайла = "D:\test.txt";
    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI, , , Символы.ПС);
    Для а = 0 По 255 Цикл
    Запись.Записать(Символ(ASCII2UNOCODE(а)));
    КонецЦикла;
    
    Запись.Закрыть();
    
    КонецПроцедуры
    
  17. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Там в серединке вопросы получаются, но за идею спасибо.

    Пробую так-сяк, видимо проблема в кодировках, уже начал от безыфсходности перебирать по одной и смотреть что пишет.
    Пока что в тяжелых раздумьях..................................................................................................................................................................................
  18. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Вы точно один в один код скопировали? Я проверял, все нормально было.
    Дело не только в кодировке, дело в последнем параметре конструктора ЗаписьТекста().

    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    ИмяФайла = "D:\test.txt";
    Запись = Новый ЗаписьТекста(ИмяФайла, "ISO-8859-1", , , Символы.ПС);
    Для а = 0 По 255 Цикл
    Запись.Записать(Символ(а));
    КонецЦикла;
    Запись.Закрыть();
    КонецПроцедуры
    а так?
  19. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Да, то что нужно!
    "ISO-8859-1", , , Символы.ПС); - что это за запятые и что такое символы.ПС?????
    Синтакс-помощник молчит, ну или во всяком случае я найти не могу!! Где об этом прочитать???

    Я уже начал подходить к решению с другой стороны.
    Вспомнил, что в 1С можно вставлять VBS скрипты (где-то видел, не помню), с примерами и божьей помощью набросал тестовый
    Dim fso, tf, a
    a = 0

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set tf = fso.CreateTextFile("d:\1ctest\"&date&".1.bd", true)

    do until a = 256
    tf.Write(chr(a))
    a = a + 1

    loop

    tf.Close
    И убедился, что VBS без всяких выкрутасов пишет в файл то что нужно. Но еще не разобрался как вставлять, ваш ответ увидел ^_^

    Сейчас попробую написать процедуру с записью того что реально требуется. Надеюсь все будет OK.
  20. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    1. запятые разделяют параметры в функции/процедуре, соответственно нет параметра значит " ,"
    2. Символы.ПС - ищите в СП по слову Символы и будет вам счастье... их несколько, конкретно этот - это перевод строки (символ окончания строки вобщем)

Поделиться этой страницей